DJ8*_*J80 2 python binding tkinter tkinter-entry
我一直试图获得一个入口值(代码中的S1)将自己设置为一个值(_attributes字典中的STR),而我无法让它工作.我想把它作为最终的toploop,但我一步一步,因为我是一般的编程新手.我是以正确的方式进行此操作,还是应该只有一个按钮,当按下该按钮时,会对该条目的值进行查找并将其与之相关联?我已经完成了我在网上为Tkinter找到的几个教程和课程,但似乎距离能够按照我期望的方式制作任何东西还有几英里远.
#! usr/bin/python27
from Tkinter import *
class Character:
def __init__(self, **kvargs):
self._attributes = kvargs
def set_attributes(self, key, value):
self._attributes[key] = value
return
def get_attributes(self, key):
return self._attributes.get(key, None)
def attrInput(stat, x, y):
"""Creates a label for entry box"""
L = Label(B,
width = 5,
relief = RIDGE,
anchor = E,
text = stat).grid(row = x,
column = y)
B = ""
def main():
Person = Character()
B = Tk()
S1 = Entry(B, width = 3)
S1.grid(row = 0, column = 1)
S1.bind("<Key>", Person.set_attributes('STR', S1.get()) )
attrInput("Str: ", 0, 0)
Button(B, text='Quit', command=B.destroy).grid(row=3, column=0, sticky=W, pady=4)
B.mainloop()
print Person.__dict__
if __name__ == '__main__': main()
Run Code Online (Sandbox Code Playgroud)
新的代码(似乎工作,我得到了我想要的东西,至少).我将不得不稍微修改它以使其成为一个toploop,但这是基础
class Character:
def __init__(self, **kvargs):
self._attribute = kvargs
def set_attribute(self, key, value):
self._attribute[key] = value
return
def get_attribute(self, key):
return self._attribute.get(key, None)
class attrAsk:
def __init__(self, master, Char, attrName, Row, Column):
self.Char = Char
self.attrName = attrName
attrInput(attrName+":", Row, Column)
self.e = Entry(master, width = 3)
self.e.grid(row = Row, column = Column+1)
self.e.bind("<KeyRelease>", self.set_attr)
def set_attr(self, event):
self.Char.set_attribute(self.attrName, self.e.get())
def attrInput(stat, x, y):
"""Creates a label for entry box"""
L = Label(box,
width = 5,
relief = RIDGE,
anchor = E,
text = stat).grid(row = x,
column = y)
Person= Character()
box = Tk()
STRENT = attrAsk(box, Person, "STR", 0, 0)
DEXENT = attrAsk(box, Person, "DEX", 1, 0)
CONENT = attrAsk(box, Person, "CON", 2, 0)
INTENT = attrAsk(box, Person, "INT", 3, 0)
WISENT = attrAsk(box, Person, "WIS", 4, 0)
CHAENT = attrAsk(box, Person, "CHA", 5, 0)
Button(box,
text='Continue',
command=box.destroy).grid(columnspan = 2,
row=8,
column=0,
sticky=W,
pady=4)
box.mainloop()
print Person.__dict__
Run Code Online (Sandbox Code Playgroud)
换行:
S1.bind("<Key>", Person.set_attributes('STR', S1.get()) )
Run Code Online (Sandbox Code Playgroud)
类似于:
def key_pressed(event):
Person.set_attributes('STR', S1.get())
S1.bind("<KeyRelease>", key_pressed)
Run Code Online (Sandbox Code Playgroud)
原始代码不起作用有两个原因:
bind将函数作为其第二个参数 - 然后在事件发生时调用该函数.Person.set_attributes('STR', S1.get())但是,使用它时的表达式只是立即发生.您需要将该表达式放入一个函数中,以便仅在按下该键时才会发生.<Key>表示在第一次按下键时发生事件,但您希望在释放键时发生(因此添加了新字符).你因此想要使用<KeyRelease>.另一个注意事项:将所有功能(尤其是回调方法)组织到一个类中是个好主意.例如:
class Window(object):
def __init__(self):
self.person = Character()
self.B = Tk()
self.S1 = Entry(B, width = 3)
self.S1.grid(row = 0, column = 1)
self.S1.bind("<KeyRelease>", self.key_pressed)
attrInput("Str: ", 0, 0)
self.button = Button(B, text='Quit', command=self.B.destroy).grid(row=3, column=0, sticky=W, pady=4)
self.B.mainloop()
print self.person.__dict__
def key_pressed(self, event):
self.person.set_attributes('STR', self.S1.get())
def main():
w = Window()
if __name__ == '__main__': main()
Run Code Online (Sandbox Code Playgroud)
这个组织的好处可能不会立即显现出来,但是一旦你拥有大量的回调方法并且跟踪大量的小部件,它就会变得非常有用.
在回复您的注释时,您可以在for循环中创建对象Entry和Label对象,每个对象都在其自己的行上.key_pressed然后,该方法可以从event传递给它的对象中学习字段和输入文本,如此处所示(尝试):
class Window(object):
def __init__(self):
self.person = Character()
self.B = Tk()
self.fields = ["STR", "DEX", "CON", "INT", "WIS", "CHA"]
self.inputs = {}
for i, f in enumerate(self.fields):
self.inputs[f] = Entry(B, width = 3)
self.inputs[f].grid(row=i, column=1)
self.inputs[f].bind("<KeyRelease>", self.key_pressed)
attrInput(f + ":", i, 0)
self.button = Button(B, text='Quit', command=self.B.destroy).grid(row=7, column=0, sticky=W, pady=4)
self.B.mainloop()
print self.person.__dict__
def key_pressed(self, event):
field = self.fields[int(event.widget.grid_info()["row"])]
self.person.set_attributes(field, event.widget.get())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7029 次 |
| 最近记录: |