【问题标题】:Return values of Tkinter text entry, close GUITkinter 文本输入的返回值,关闭 GUI
【发布时间】:2013-06-06 14:14:22
【问题描述】:

我有以下 GUI 代码,但我无法开始工作。我希望它执行以下操作:

  1. 对于提交功能,我希望它检查 Val1 或 Val2 是否为空,然后警告用户并暂停该功能以允许用户输入一个值,然后执行该功能的其余部分。这包括关闭 GUI(我不知道该怎么做,除了手动关闭它)。
  2. 我还希望 GUI 从类中返回 Val1 和 Val2。代码的最后一行是“print Total”,这是我给返回值起的名字。

    import Tkinter
    import tkMessageBox
    class Values(Tkinter.Tk):
       def __init__(self,parent):
            Tkinter.Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
       def initialize(self):
            self.grid()
            stepOne = Tkinter.LabelFrame(self, text=" 1. Enter Values ")
            stepOne.grid(row=0, columnspan=7, sticky='W',padx=5, pady=5, ipadx=5, ipady=5)
            Val1Lbl = Tkinter.Label(stepOne,text="Value 1")
            Val1Lbl.grid(row=0, column=0, sticky='E', padx=5, pady=2)
            Val1Txt = Tkinter.Entry(stepOne)
            Val1Txt.grid(row=0, column=1, columnspan=3, pady=2, sticky='WE')
            Val2Lbl = Tkinter.Label(stepOne,text="Value 2")
            Val2Lbl.grid(row=1, column=0, sticky='E', padx=5, pady=2)
            Val2Txt = Tkinter.Entry(stepOne)
            Val2Txt.grid(row=1, column=1, columnspan=3, pady=2, sticky='WE')
        def submit():
           Val1=Val1Txt.get()
           if Val1 == '':
               Win2=Tkinter.Tk()
               Win2.withdraw()
               tkMessageBox.showinfo(message="Value 1 is empty")
              ##Stop submit from going any further.Allow user to enter a value and then          
              ##carryout.  
    
            Val2=Val2Txt.get()
            if Val2 == '':
                Win2=Tkinter.Tk()
                Win2.withdraw()
                tkMessageBox.showinfo(message="Value 2 is empty")
                ###Stop submit from going any further.Allow user to enter a value and then
                ##carryout
    
             ###Close GUI (Part of submit function)
             return Val1,Val2
    
         SubmitBtn = Tkinter.Button(stepOne, text="Submit",command=submit)
         SubmitBtn.grid(row=4, column=3, sticky='W', padx=5, pady=2)
    if__name__== "__main__":  
         app = Values(None)
         app.title('Values')
         app.mainloop()
    
    
    ###Do something with returned values
    Total = Values##Is this the correct way of getting the returned values?
    print Total
    

【问题讨论】:

    标签: python class tkinter return


    【解决方案1】:

    Hrrm...您确定不想让 Val1 和 Val2 成为 Values 类的属性,并让提交按钮设置值吗?

    然后您可以随时检查/返回/使用它们与 self.Val1 和 self.Val2 吗?您也可以使用 self.destroy() 或 self.quit() 销毁窗口(查看这些方法中的每一个并确定哪些对您有用)。

    通常,按钮回调不用于以您描述的方式返回值。通常他们会运行一些函数来处理或修改类的属性。

    另外,请记住,这些属性可以在退出主循环后访问,这似乎是您想要对它们执行的操作:

    编辑:以下是您的代码的略微简化版本。我删除了消息框的东西,为你的类设置了值和字段属性,并在你的提交按钮中添加了一个 quit() 方法。

    import Tkinter
    
    
    class Values(Tkinter.Tk):
        """docstring for Values"""
        def __init__(self, parent):
            Tkinter.Tk.__init__(self,parent)
            self.parent = parent
            self.initialize()
    
        def initialize(self):
            self.grid()
            stepOne = Tkinter.LabelFrame(self, text=" 1. Enter Values ")
            stepOne.grid(row=0, columnspan=7, sticky='W',padx=5, pady=5, ipadx=5, ipady=5)
            self.Val1Lbl = Tkinter.Label(stepOne,text="Value 1")
            self.Val1Lbl.grid(row=0, column=0, sticky='E', padx=5, pady=2)
            self.Val1Txt = Tkinter.Entry(stepOne)
            self.Val1Txt.grid(row=0, column=1, columnspan=3, pady=2, sticky='WE')
            self.Val2Lbl = Tkinter.Label(stepOne,text="Value 2")
            self.Val2Lbl.grid(row=1, column=0, sticky='E', padx=5, pady=2)
            self.Val2Txt = Tkinter.Entry(stepOne)
            self.Val2Txt.grid(row=1, column=1, columnspan=3, pady=2, sticky='WE')
    
            self.val1 = None
            self.val2 = None
    
            SubmitBtn = Tkinter.Button(stepOne, text="Submit",command=self.submit)
            SubmitBtn.grid(row=4, column=3, sticky='W', padx=5, pady=2)
    
        def submit(self):
            self.val1=self.Val1Txt.get()
            if self.val1=="":
                Win2=Tkinter.Tk()
                Win2.withdraw()
    
            self.val2=self.Val2Txt.get()
            if self.val2=="":
                Win2=Tkinter.Tk()
                Win2.withdraw()
    
            self.quit()
    
    
    if __name__ == '__main__':
        app = Values(None)
        app.title('Values')
        app.mainloop() #this will run until it closes
        #Print the stuff you want.
        print app.val1,app.val2
    

    【讨论】:

    • 1.将 Val1 和 Val2 作为属性,以便我在 Values 类之外使用它们听起来像我想要的。我试过了,但我无法让它工作。你能展示必要的修改吗? 2. 在提交按钮的情况下,如果条目有值,则关闭表单。我计划稍后在使用各种公式时使用这些值。 3. 如果用户在按下提交按钮之前更改了值会发生什么?
    • 谢谢,但是“self.val2 = None”是干什么用的? self.quit() 还会导致程序挂起/冻结,如果有帮助,我将在 Windows 7 上使用 Python 2.7。
    • @Jay:哦,我只是给他们一些默认值。这样,如果用户在为它们分配值之前(通过提交按钮)关闭了用户界面,那么当你使用这些值时它不会抛出错误。
    • 没有比将变量设置为实例变量然后在对象被销毁之前像这样访问它们更“更好”的方法吗?
    猜你喜欢
    • 2020-12-06
    • 2018-01-17
    • 2015-04-18
    • 2012-05-21
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    相关资源
    最近更新 更多