【问题标题】:if statement causes tkinter program to hangif 语句导致 tkinter 程序挂起
【发布时间】:2013-06-13 16:29:59
【问题描述】:

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

但是,这是我遇到问题的地方,我进行了以下测试: 1.为Value 2输入了一个值,而为Value 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 和 2 输入数字时,它对我有用。如果您愿意,我可以将重新缩进的代码发布为回答。
  • 您使用 Tkinter 错误。你不应该多次创建Tk 的实例。我不知道这是否是您问题的直接原因,但这绝对是 a 问题。

标签: python if-statement tkinter tkinter-entry


【解决方案1】:
  • 固定缩进。
  • 删除了 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

【讨论】:

  • 如果您描述了您所做的一个或多个更改,以及为什么需要这些更改,您的回答会更有用。简单地发布代码意味着有人必须逐行找出您所做的不同之处。即便如此,他们也不一定知道您为什么制作它们。
  • @BryanOakley,在这里也添加了评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多