Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter事件小部件_Python_User Interface_Tkinter - Fatal编程技术网

Python Tkinter事件小部件

Python Tkinter事件小部件,python,user-interface,tkinter,Python,User Interface,Tkinter,我目前正在类中使用Tkinter制作GUI。我希望GUI根据用户先前的选择向用户询问各种输入。另外,我会注意到,我对python比较陌生,而且肯定是Tkinter。但是,我以前在MATLAB中制作过GUI 所以,我想做的是: 询问用户处理速度,以逗号分隔。然后,用户将输入以下速度:[90100102p5]。 要从条目中获取输入,必须按Enter键,该键将调用函数以获取速度字符串。然后,我获取输入的字符串,并根据逗号将其分隔,形成一个列表 然后,一旦输入了速度,我想更新GUI并显示每个速度的输

我目前正在类中使用Tkinter制作GUI。我希望GUI根据用户先前的选择向用户询问各种输入。另外,我会注意到,我对python比较陌生,而且肯定是Tkinter。但是,我以前在MATLAB中制作过GUI

所以,我想做的是:

  • 询问用户处理速度,以逗号分隔。然后,用户将输入以下速度:[90100102p5]。
    • 要从条目中获取输入,必须按Enter键,该键将调用函数以获取速度字符串。然后,我获取输入的字符串,并根据逗号将其分隔,形成一个列表
  • 然后,一旦输入了速度,我想更新GUI并显示每个速度的输入部分,以输入特定速度下的各种压力,用逗号分隔。压力的形式为[100kpa,200kpa,300kpa,400kpa]。
    • 要获得为每个压力输入的值,必须像前面一样在每个输入框中按enter键。我再一次把这根绳子做成一个压力表
  • 我的方法很有效,但我认为这不是最佳实践。这是一个链接,用于查看输入各种速度时GUI的外观,如步骤1所述:

    最终,在这个GUI的末尾,我希望有一个速度列表,每个速度都有一个压力列表。然后我将获取这些列表,并将它们交给另一个函数来运行我以前创建的程序

    需要注意的是,我不知道用户希望处理多少速度。我也不知道每个速度会输入多少压力

    因此,以下是我的问题: 这是Tkinter处理事件的“pythonic”方式吗?我在网上没有找到任何关于如何根据上一个小部件的完成情况(按Enter键)显示新小部件的信息

    我也不是100%确定在不同方法之间传递变量的最佳方法是否是使变量成为self的属性。例如,我如何传递“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导入*
    导入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的压力。”当用户单击“确定”时,会出现一个对话框