gpt4 book ai didi

python:采用 Tkinter 入口值

转载 作者:行者123 更新时间:2023-11-28 21:25:24 27 4
gpt4 key购买 nike

我一直在尝试获取一个条目值(代码中的 S1)以将其自身设置为一个值(_attributes 字典中的 STR),但我就是无法让它工作。我想让它成为一个最终的顶层循环,但我在这方面一步一步来,因为我是一般编程的新手。我是在以正确的方式解决这个问题,还是应该只拥有一个按钮,当按下该按钮时,它会查找当时的条目值并随之而来?我已经阅读了一些我在网上找到的 Tkinter 教程和类(class),但似乎距离能够让任何东西按照我期望的方式工作还有很长的路要走。

#! 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()

新代码(似乎可以正常工作,至少我从中得到了我想要的)。我将不得不稍微修改它以使其成为顶层循环,但这是基础

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__

最佳答案

改变行:

S1.bind("<Key>", Person.set_attributes('STR', S1.get()) )

类似于:

def key_pressed(event):
Person.set_attributes('STR', S1.get())
S1.bind("<KeyRelease>", key_pressed)

原始代码不起作用的原因有两个:

  1. bind将一个函数作为它的第二个参数——当事件发生时,该函数将被调用。表达式 Person.set_attributes('STR', S1.get())然而,当您使用它时,立即就会发生。您需要将该表达式放入一个函数中,以便它仅在按下键时发生。
  2. <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()

这种组织的好处可能不会立即显现出来,但一旦您拥有大量回调方法并跟踪大量小部件,它就会变得非常有用。

作为对您评论的回应,您可以同时创建 EntryLabel for 循环中的对象,每个对象都在自己的行中。 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())

关于python:采用 Tkinter 入口值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14411149/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com