if语句导致tkinter程序挂起

时间:2013-06-13 16:29:59

标签: python if-statement tkinter tkinter-entry

使用Python 2.7.3,我创建了以下tkinter代码。该代码要求用户在GUI中输入两个值,这些值将被提交并且GUI将被关闭。但是我遇到了提交按钮的问题。当用户单击提交时,会发生以下情况: 1. if语句,用于确认值1是否具有值,如果不是,则显示消息框。 2. if语句,用于确认值2是否具有值,如果不是,则显示消息框。 3.如果值1和值2都有值,则GUI将关闭。

然而,这是我遇到问题的地方,我进行了以下测试: 1.输入值2的值,没有值1的值,第一个if语句被触发,这很好。 2.输入值1的值,没有值2的值,第二个if语句被触发,这很好。 3.输入值1和值2,导致GUI关闭,这很好,但python代码挂起,最后一行代码“print c”没有出现。

造成这种情况的原因是什么?

这个想法是这个GUI将用于我的函数文件的输入。此代码是对GUI的测试。

import Tkinter
import sys
import tkMessageBox


class GUI(Tkinter.Tk):
"""docstring for Values"""
   def __init__(self, parent):
       Tkinter.Tk.__init__(self,parent)
       self.parent = parent

       ###if user hits close button
       def callback():
            if tkMessageBox.askokcancel("Quit", "Do you really wish to quit?"):
            self.destroy()
            sys.exit()

       self.protocol("WM_DELETE_WINDOW", callback) 
       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

      self.SubmitBtn = Tkinter.Button(stepOne, text="Submit",command=self.submit)
      self.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()
         tkMessageBox.showinfo(message="Value 1 has no values entered")

      self.val2=self.Val2Txt.get()
      if self.val2=="":
         Win2=Tkinter.Tk()
         Win2.withdraw()
         tkMessageBox.showinfo(message="Value 2 has no values entered")

    ###Close GUI if Val1 and Val2 have values    
      if len(self.val2)>0 and len(self.val1)>0:
         self.destroy()


app = GUI(None)
app.title('Values')
app.mainloop()
#calculate values of Val1 and Val2 
a=float(app.val1)
b=float(app.val2)
c=a+b
print c

1 个答案:

答案 0 :(得分:0)

  • 固定缩进。
  • 删除了Tkinter.Tk()

import Tkinter
import sys
import tkMessageBox


class GUI(Tkinter.Tk):
    """docstring for Values"""
    def __init__(self, parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent

        ###if user hits close button
        def callback():
            if tkMessageBox.askokcancel("Quit", "Do you really wish to quit?"):
                self.destroy()
                sys.exit()

        self.protocol("WM_DELETE_WINDOW", callback)
        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

        self.SubmitBtn = Tkinter.Button(stepOne, text="Submit",command=self.submit)
        self.SubmitBtn.grid(row=4, column=3, sticky='W', padx=5, pady=2)

    def submit(self):
        self.val1 = self.Val1Txt.get()
        if self.val1 == "":
             tkMessageBox.showinfo(message="Value 1 has no values entered")
             return

        self.val2 = self.Val2Txt.get()
        if self.val2 == "":
             tkMessageBox.showinfo(message="Value 2 has no values entered")
             return

        ###Close GUI if Val1 and Val2 have values
        if self.val1 and self.val2:
             self.destroy()


app = GUI(None)
app.title('Values')
app.mainloop()
#calculate values of Val1 and Val2
a=float(app.val1)
b=float(app.val2)
c=a+b
print c