【问题标题】:Jump out in Tkinter loop在 Tkinter 循环中跳出
【发布时间】:2015-04-10 03:23:02
【问题描述】:

我正在研究一个 Tkinter 不会跳出的问题。

这是我正在运行的:

from Tkinter import *
import ttk

def plus(*args):
    value = float(a.get())
    value1 = float(b.get())
    result.set(value + value1)
    print "the result is " + str(result.get())

root = Tk()
root.title("Plus them")

mainframe = ttk.Frame(root, padding="10 10 10 10")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

a = StringVar()
b = StringVar()
result = StringVar()

feet_entry = ttk.Entry(mainframe, width=5, textvariable=a)
feet_entry.grid(column=2, row=1, sticky=(W, E))

feet_entry1 = ttk.Entry(mainframe, width=5, textvariable=b)
feet_entry1.grid(column=5, row=1, sticky=(W, E))

ttk.Label(mainframe, text="the result is").grid(column=3, row=2, sticky=W)
ttk.Label(mainframe, textvariable = result).grid(column=5, row=2, sticky=(W, E))

ttk.Button(mainframe, text="Plus", command=plus).grid(column=3, row=3, sticky=W)

for child in mainframe.winfo_children():
    child.grid_configure(padx=5, pady=5)
    feet_entry.focus()
    root.bind('<Return>', plus)
    root.mainloop()

当它运行时,它看起来很好。但是无论我点击多少次“加号”它都不会“跳出”,直到我输入新的值进行计算,它仍然在等待新的输入。

我如何调整让它只计算一次?谢谢。

【问题讨论】:

  • 不明白你想要达到什么目的。这个for循环for child in mainframe.winfo_children()的目的是什么?

标签: python user-interface loops tkinter ttk


【解决方案1】:

要让您的窗口只执行一次并让加号按钮关闭窗口,请执行以下操作:

from Tkinter import *
import ttk




def plus(*args):
    value = float(a.get())
    value1 = float(b.get())
    result.set(value + value1)
    print "the result is " + str(result.get())
    root.destroy()             ####### look here !!!#######

root = Tk()

root.title("Plus them")

mainframe = ttk.Frame(root, padding="10 10 10 10")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)

a = StringVar()
b = StringVar()
result = StringVar()

feet_entry = ttk.Entry(mainframe, width=5, textvariable=a)
feet_entry.grid(column=2, row=1, sticky=(W, E))

feet_entry1 = ttk.Entry(mainframe, width=5, textvariable=b)
feet_entry1.grid(column=5, row=1, sticky=(W, E))

ttk.Label(mainframe, text="the result is").grid(column=3, row=2, sticky=W)
ttk.Label(mainframe, textvariable = result).grid(column=5, row=2, sticky=(W, E))

ttk.Button(mainframe, text="Plus", command=plus).grid(column=3, row=3, sticky=W)


# for child in mainframe.winfo_children():
#     child.grid_configure(padx=5, pady=5)

feet_entry.focus()
root.bind('<Return>', plus)

root.mainloop()

因此,在您的 plus callbeck 中,您需要致电 root.destroy()。这个循环for child in mainframe.winfo_children() 在我的选择中也没有意义,也不需要它。所以我在示例中删除了它。

【讨论】:

  • 太棒了!谢谢。如果我想在执行脚本后保持 GUI 运行/打开,而不是在运行后关闭它,该怎么办?我的意思是我可以使用同一个小窗口进行不同的计算,而无需每次都打开它。有可能吗?
  • 你不能。 root.mainloop() 是一个无限循环。在你关闭它之前,root.mainloop() 之后的任何内容都不会被执行。但是,如果您想保持窗口打开并计算多个总和,只需在 plus 回调中注释掉 root.destroy()
  • 再次感谢。顺便说一句,我梦想制作一个小程序,所以很可能我需要将上面的打包成一个 .exe 文件?请您也给我指个方向好吗?非常感谢。
  • 不幸的是无法帮助执行 exe。我在 Linux 上工作,那里没有 exe 文件。在 windows 上对 python 没有太多经验:-(
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2012-01-16
  • 2020-05-21
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多