我目前正在一个类中使用Tkinter的GUI。我希望GUI根据以前的选择向用户询问各种输入。另外,我会注意到我对python比较陌生,绝对是Tkinter。不过,我之前已经在MATLAB中制作了GUI。Tkinter事件小部件
所以,我想要做的是以下几点:
- 要求用户提供速度来处理,用逗号分隔。然后用户将输入如下所示的速度:[90,100,102p5]。
- 要从条目中获得输入,您必须按Enter键,该键将调用函数以获取速度字符串。然后我输入输入的字符串并根据逗号分隔它们以形成一个列表。
- 然后,一旦输入速度,我想更新GUI并显示每个速度的输入部分,以逗号分隔的特定速度输入各种压力。压力将以[100kpa,200kpa,300kpa,400kpa]的形式出现。
- 要获得为每个压力输入的值,必须在每个输入框中按enter键,就像之前一样。我再次将这个字符串形成一个压力列表。
,我有工作的方法,但是我不认为这是最好的做法。这是查看输入各种速度时GUI的外观的链接,如步骤1中所述:GUI Image
最终,在此GUI的最后,我希望有一个速度列表,并且对于每个速度a压力清单。然后,我将采取这些列表,并让他们到另一个功能来运行我以前创建的程序。
有一点需要注意的是,我不知道用户需要处理多少速度。我也不知道每种速度会输入多少压力。
所以,这些是我的问题: 这是用Tkinter处理事件的“pythonic”方式吗?我没有在网上找到任何关于如何根据上一个完成(通过按Enter键)显示一个新小部件的任何信息。
我也不是100%确定在不同方法之间传递变量的最佳方法是通过使变量成为自身属性。例如,我如何传递“speeds”变量和字典“bp”。我应该使用全局变量吗?它也变得复杂,因为我必须通过一个事件来传递变量,这个事件不允许额外的参数。
非常感谢您的帮助!如果你知道一个很好的网站,以更有用的方式解释Tkinter,那也会有帮助!
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的一个很棒的网站:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html – saulspatz
'self.speed_widgets()def speed_widgets(self):'是一行语法错误。请发布工作代码,或者至少需要编译的代码。 – saulspatz
谢谢你的链接!对于格式问题感到抱歉 - 当我将代码从vi复制到本网站时必定发生。我确实修复了它。 – elmons13