gpt4 book ai didi

Python Tkinter 小键盘按钮和多个输入

转载 作者:行者123 更新时间:2023-12-01 09:19:31 25 4
gpt4 key购买 nike

基本上,我试图做到这一点,以便当您更改 Entry 输入字段时,按钮会将其标签附加到正确的输入。

我正在使用 active_entry 来定位刚刚关注的输入。出于某种原因,事件绑定(bind)无法正确地将其更改为新的输入字段。

更改默认Entry然后按button_1后的实际结果:TypeError: getattr(): attribute name must be string

from tkinter import *

class App(Tk):
def __init__(self):
Tk.__init__(self)
self.set_active_entry('entry_1_var') # set initial active entry
self.entry_1_var = StringVar()
self.entry_2_var = StringVar()
self.entry_1 = Entry(self, width=10, font='Helvetica 32', textvariable=self.entry_1_var)
self.entry_2 = Entry(self, width=10, font='Helvetica 32', textvariable=self.entry_2_var)
self.create_widgets()
self.entry_binding()

def set_active_entry(self, name):
self._active_entry = name
print(self._active_entry)

@property
def active_entry(self):
return getattr(self, self._active_entry)

@active_entry.setter
def active_entry(self, value):
setattr(self, self._active_entry, value)

def create_widgets(self):
self.entry_1.pack()
self.entry_2.pack()

label = '1'
button_1 = Button(self, text=label, width=10, height=5, command=lambda x=label: self.num_pad(x))
button_1.pack()

def entry_binding(self):
self.entry_1.bind('<FocusIn>', lambda x='entry_1_var': self.set_active_entry(x))
self.entry_2.bind('<FocusIn>', lambda x='entry_2_var': self.set_active_entry(x))

def num_pad(self, label):
current_text = self.active_entry.get()
self.active_entry.set(current_text+label)

app = App()
app.mainloop()

最佳答案

问题出在这几行

self.entry_1.bind('<FocusIn>', lambda x='entry_1_var': self.set_active_entry(x))
self.entry_2.bind('<FocusIn>', lambda x='entry_2_var': self.set_active_entry(x))

当您单击其中一个条目时,您会看到 <FocusIn event>正在打印,而您原本期望它是 entry_1_varentry_2_var对吗?

发生的情况是bind函数自动将事件对象传递给您指定的函数。在您的 lambda 函数中,第一个参数是 x 。您确实指定了默认值,但由于实际对象是由 bind 传递的函数,x 是事件对象。所以在 def set_active_entry(self, name): , name不是您的小部件的名称,而是事件对象。因此,当您调用getattr(self, self._active_entry)时, self._active_entry是事件对象,您会收到错误。

解决这个问题实际上非常简单,只需在 lambda 函数中接受一个参数来接受事件对象,并确保您实际上将带有名称的字符串传递给 set_active_entry功能:

self.entry_1.bind('<FocusIn>', lambda e, x='entry_1_var': self.set_active_entry(x))
self.entry_2.bind('<FocusIn>', lambda e, x='entry_2_var': self.set_active_entry(x))

self.entry_1.bind('<FocusIn>', lambda e: self.set_active_entry('entry_1_var'))
self.entry_2.bind('<FocusIn>', lambda e: self.set_active_entry('entry_2_var'))

关于Python Tkinter 小键盘按钮和多个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50912587/

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