Python Tkinter事件小部件
我目前正在类中使用Tkinter制作GUI。我希望GUI根据用户先前的选择向用户询问各种输入。另外,我会注意到,我对python比较陌生,而且肯定是Tkinter。但是,我以前在MATLAB中制作过GUI 所以,我想做的是:Python Tkinter事件小部件,python,user-interface,tkinter,Python,User Interface,Tkinter,我目前正在类中使用Tkinter制作GUI。我希望GUI根据用户先前的选择向用户询问各种输入。另外,我会注意到,我对python比较陌生,而且肯定是Tkinter。但是,我以前在MATLAB中制作过GUI 所以,我想做的是: 询问用户处理速度,以逗号分隔。然后,用户将输入以下速度:[90100102p5]。 要从条目中获取输入,必须按Enter键,该键将调用函数以获取速度字符串。然后,我获取输入的字符串,并根据逗号将其分隔,形成一个列表 然后,一旦输入了速度,我想更新GUI并显示每个速度的输
- 要从条目中获取输入,必须按Enter键,该键将调用函数以获取速度字符串。然后,我获取输入的字符串,并根据逗号将其分隔,形成一个列表
- 要获得为每个压力输入的值,必须像前面一样在每个输入框中按enter键。我再一次把这根绳子做成一个压力表
from Tkinter import *
import tkMessageBox
class MyWindow(Frame):
def __init__(self, master):
self.speeds = []
Frame.__init__(self, master)
self.speed_widgets()
def speed_widgets(self):
label = Label(self.master, text="Enter the speeds you want to process, seperated by a comma:")
label = label.grid(row=0)
self.speeds_text = Entry(self.master)
self.speeds_text.grid(row=0, column=1)
self.speeds_text.bind('<Return>', self.get_speeds)
def get_speeds(self, event):
#global speeds
self.speeds = self.speeds_text.get()
if (not self.speeds):
tkMessageBox.showerror('Invalid Entry','Please enter at least one speed.')
else:
self.speeds = ''.join(self.speeds.split())
self.speeds = self.speeds.split(',')
num_speeds = len(self.speeds)
#print speeds
self.bp_widget()
def bp_widget(self):
keys = []
for speed in self.speeds:
keys.append(speed)
self.bp = dict.fromkeys(keys)
label = Label(self.master, text='Enter the back pressures for each speed, seperated by a comma:')
label = label.grid(row=1)
i = 2
self.bp_text_widgets = []
for speed in self.speeds:
label = Label(self.master, text=speed+'=')
label.grid(row=i, column=0)
self.bp_text_widgets.append(Entry(self.master))
self.bp_text_widgets[i-2].grid(row=i,column=1)
self.bp_text_widgets[i-2].bind('<Return>', lambda event, arg=i: self.get_bp(event, arg))
i += 1
def get_bp(self, event, i):
self.bp[self.speeds[i-2]] = self.bp_text_widgets[i-2].get()
print self.bp[self.speeds[i-2]]
root = Tk()
MyWindow(root)
root.mainloop()
从Tkinter导入*
导入tkMessageBox
类MyWindow(框架):
定义初始(自我,主):
self.speeds=[]
帧。\uuuu初始化(自,主)
self.speed_widgets()
def速度_小部件(自身):
label=label(self.master,text=“输入要处理的速度,用逗号分隔:”)
label=label.grid(行=0)
self.speeds\u text=条目(self.master)
self.speeds\u text.grid(行=0,列=1)
self.speeds\u text.bind(“”,self.get\u speeds)
def get_速度(自身、事件):
#全球速度
self.speeds=self.speeds\u text.get()
如果(非自速度):
tkMessageBox.SwarthRor('输入无效','请至少输入一种速度')
其他:
self.speeds=''.join(self.speeds.split())
self.speeds=self.speeds.split(','))
num_速度=len(自速度)
#打印速度
self.bp_小部件()
def bp_小部件(自身):
键=[]
对于自身速度中的速度:
附加键(速度)
self.bp=dict.fromkeys(键)
标签=标签(self.master,text='输入每个速度的背压,用逗号分隔:')
label=label.grid(行=1)
i=2
self.bp_text_小部件=[]
对于自身速度中的速度:
标签=标签(self.master,text=speed+'='))
label.grid(行=i,列=0)
self.bp_text_widgets.append(条目(self.master))
self.bp\u text\u小部件[i-2]。网格(行=i,列=1)
self.bp_text_小部件[i-2]。绑定(“”,lambda事件,arg=i:self.get_bp(事件,arg))
i+=1
def get_bp(自身、事件、i):
self.bp[self.speeds[i-2]]=self.bp\u text\u小部件[i-2].get()
打印self.bp[self.speeds[i-2]]
root=Tk()
MyWindow(根目录)
root.mainloop()
关于全局变量的问题很容易回答。一般来说,最好避开它们。从我所看到的情况来看,将这些值保存为属性是绝大多数人的做法
至于如何使用入口小部件,我看到了几个问题。首先,如果我在第一个小部件中输入五个速度,然后按enter键,就会出现五个新的输入小部件。到目前为止,一切顺利。然而,如果我现在意识到我犯了一个错误,返回并删除了一个速度,我仍然有5个条目小部件。我已经玩过了,添加和删除速度,我可以得到的GUI都搞砸了
第二,如果在添加背压后忘记按Enter键,或者如果我纠正背压中的错误,然后忘记按Enter键,会发生什么情况?问题是我只看到输入,没有确认应用程序实际收到了什么
这可能是一个品味的问题,但我喜欢做的是弹出一个用于输入数据的对话框,如果可能的话,在GUI中的某个地方回显输入数据。因此,我会有一个标记为“输入速度”的按钮,它会弹出一个对话框,用户可以在其中输入速度。当他点击ok时,会创建一个标签,上面有“Speeds708090”这样的文字。标签旁边会有一个“编辑”按钮,以防用户改变主意,或想输入新问题
对于每种速度,我都会弹出一个对话框,上面有如下说明:“输入速度80的压力。”当用户单击“确定”时,会出现一个对话框