【发布时间】:2019-06-23 11:58:34
【问题描述】:
我有一个 tkinter 应用程序,它有 2 个输入框和数字 0-9 的按钮。我希望能够使用按钮输入IntVar(),但可以输入焦点Entry()。目前我可以按下按钮将IntVar() 输入到第一个Entry() 框中,但我无法弄清楚或在网上找到如何仅将IntVar() 输入到焦点Entry() 框中。
import sys
from tkinter import Tk, Text, BOTH, W, N, E, S, IntVar
from tkinter.ttk import Frame, Button, Label, Style, Entry
expression = ''
class Example(Frame):
def __init__(self, *args, **kwargs):
Frame.__init__(self, *args, **kwargs)
self.name = 'Application'
self.master.title(self.name)
self.pack(fill=BOTH, expand=True)
cancel_btn_style = Style()
cancel_btn_style.configure('CNL.TButton', background='red')
cancel_btn_style = Style()
cancel_btn_style.configure('LGN.TButton', background='green')
self.columnconfigure(1, weight=1)
self.columnconfigure(2, weight=1)
self.columnconfigure(3, weight=1)
self.rowconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
self.rowconfigure(2, weight=1)
self.rowconfigure(3, weight=1)
self.rowconfigure(4, weight=1)
self.rowconfigure(5, weight=1)
self.user_number_var = IntVar()
self.main_label = Label(self, text=self.name)
self.main_label.grid(sticky=W, pady=4, padx=5)
self.entry_label = Label(self, text='User Number / PIN')
self.entry_label.grid(
row=1, column=0, columnspan=1,
rowspan=1, padx=5, sticky=E+W+S+N
)
vcmd = (self.register(self.__vcmd), '%P')
self.user_number_entry = Entry(
self, validate='key', validatecommand=vcmd,
textvariable=self.user_number_var
)
self.user_number_entry.grid(
row=1, column=1, columnspan=1,
rowspan=1, sticky=N+S+E+W, pady=4
)
self.pin_number_entry = Entry(self, validate='key', validatecommand=vcmd, show='*')
self.pin_number_entry.grid(
row=1, column=2, columnspan=1,
rowspan=1, sticky=N+S+E+W, pady=4
)
self.btn_1 = Button(self, text='1', command=lambda: self.press(1))
self.btn_1.grid(row=2, column=0, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_2 = Button(self, text='2', command=lambda: self.press(2))
self.btn_2.grid(row=2, column=1, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_3 = Button(self, text='3', command=lambda: self.press(3))
self.btn_3.grid(row=2, column=2, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_4 = Button(self, text='4', command=lambda: self.press(4))
self.btn_4.grid(row=3, column=0, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_5 = Button(self, text='5', command=lambda: self.press(5))
self.btn_5.grid(row=3, column=1, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_6 = Button(self, text='6', command=lambda: self.press(6))
self.btn_6.grid(row=3, column=2, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_7 = Button(self, text='7', command=lambda: self.press(7))
self.btn_7.grid(row=4, column=0, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_8 = Button(self, text='8', command=lambda: self.press(8))
self.btn_8.grid(row=4, column=1, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_9 = Button(self, text='9', command=lambda: self.press(9))
self.btn_9.grid(row=4, column=2, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.cancel_btn = Button(self, text='Cancel / Close', command=sys.exit, style='CNL.TButton')
self.cancel_btn.grid(row=5, column=0, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.btn_0 = Button(self, text='0', command=lambda: self.press(0))
self.btn_0.grid(row=5, column=1, columnspan=1, rowspan=1, sticky=N+S+E+W)
self.login_btn = Button(self, text='Log In', style='LGN.TButton')
self.login_btn.grid(row=5, column=2, columnspan=1, rowspan=1, sticky=N+S+E+W)
def press(self, num):
# point out the global expression variable
global expression
# concatenation of string
expression = expression + str(num)
# update the expression by using set method
self.user_number_var.set(expression)
def __vcmd(self, P, S):
print('__vcmd')
def main():
root = Tk()
root.geometry('540x640')
app = Example(root)
root.mainloop()
if __name__ == '__main__':
main()
我需要按钮来输入数字到self.user_number_entry 或self.pin_number_entry,这取决于哪个有焦点。
【问题讨论】:
-
首先是你第一个(粗鲁)说短代码块太长/太多的人,所以请冷静一下!我不欣赏它,您的声望并不高,因为您有很多声望!这个社区以不友好而闻名,像你这样的人。现在我的理解是,我的代码使用
self.user_number_var = IntVar()来初始化一个整数变量,并使用IntVar()分配给self.user_number_var的名称,从而将文本设置在self.user_number_entry中。 -
如果你冒犯了我很抱歉。我尽量礼貌地问(“请减少...”)。感谢您的澄清。如果我理解你的评论是正确的,当你写“输入一个 IntVar”时,你实际上是指“将一个 IntVar 分配给一个条目”。那是对的吗?不过,我仍然不明白这与专注有什么关系。为什么你只想要与焦点小部件关联的变量,而不是每个小部件一个?
-
也许我也把你的评论放在心上(我只是厌倦了人们在这里粗鲁,这让人不想待在这里)无论如何让我们继续前进。在我看来,我们输入到
Entry(),而不是分配给一个。无论如何,我精通基于 Gtk 类的 GUI,并试图学习更复杂的 tkinter GUI,所以我正处于那个事情还不太有意义的阶段。基本上我不必按照我已经建立的方式这样做,我只想能够使用编号按钮将数字输入到Entry()中,在任何给定时刻都有焦点,.....[继续] -
所以如果我点击
self.user_number_entry然后点击按钮将输入该数字到self.user_number_entry然后当我输入用户号码并点击self.pin_number_entry点击按钮将进入将数字转换为self.pin_number_entry。正是在我尝试了如此多的变化时,我变得困惑并且无法跟踪我已经尝试过的内容,我尝试了 Chuck G 的答案,但它似乎不起作用。 -
是的,用户在输入字段中输入数据。但是,您不会“输入”我的困惑所在的 IntVar。
标签: tkinter python-2.x