【发布时间】:2016-12-03 17:31:53
【问题描述】:
我想制作一个程序,在单击按钮后,用户会被询问其名称,然后程序继续运行。我坚持让弹出窗口返回已在弹出窗口中输入的文本字符串。起初我以为这是我的代码,但我决定制作第二个程序,它只询问名称,打印它,打印它的长度和类型。在第二个程序中,一切正常。我很难弄清楚为什么它不在第一个(更大的)程序中。我已经读过 (Why is Tkinter Entry's get function returning nothing?) 并且即使我的 .get() 函数出现在我的 .mainloop 之后,它仍然不起作用;在同一个线程中,他们建议使用类,我对此一无所知。如果可能的话,谁能指出我在更大的程序中缺少什么?
大型计划
from Tkinter import *
root = Tk()
root.title("Ask-name-SUB")
def getname(usertype):
getname = Tk()
getname.title("Get name popup")
def abort():
getname.destroy()
name = StringVar()
c = LabelFrame(getname, text = "Your name:")
c.pack()
d = Entry(getname, textvariable=name)
d.pack(side="right")
d.bind("<Return>", lambda event: getname.destroy())
e = Button(getname, text = "Cancel", command=lambda: abort())
e.pack()
getname.mainloop()
name = (name.get())
print "Print name, its length, its type"
print name
print len(name)
print type(name)
top = Frame(root)
top.pack(side="top")
bottom = Frame(root)
bottom.pack(side="bottom")
def killit():
root.destroy()
cancel = Button (bottom, text = "Cancel", command=lambda: killit())
cancel.pack()
askname = Button (top, text = "Enter your name", command=lambda: getname("testuser"))
askname.pack()
root.mainloop()
小程序
from Tkinter import *
def getname(usertype):
getname = Tk()
getname.title("Get name popup")
def abort():
getname.destroy()
name = StringVar()
c = LabelFrame(getname, text = "Your name:")
c.pack()
d = Entry(getname, textvariable=name)
d.pack(side="right")
d.bind("<Return>", lambda event: getname.destroy())
e = Button(getname, text = "Cancel", command=lambda: abort())
e.pack()
getname.mainloop()
name = (name.get())
print "Print name, its length, its type"
print name
print len(name)
print type(name)
getname("testuser")
【问题讨论】:
-
更大的程序对我不起作用,因为你把名字
getname弄乱了 - 你定义了函数getname并在小部件中使用它,因为你认为你有getname = Tk()但事实并非如此. -
顺便说一句:我们使用
Tk()只创建主窗口。如果您需要弹出/对话框窗口,请使用Toplevel() -
顺便说一句:可能你的大程序有错误的缩进 - 但我认为问题是因为程序应该只有一个
mainloop()(并且只有一个Tk()作为主窗口) -
非常感谢 Furas,我会在早上试试这个。我可以问另外两个小问题吗,我是使用'popupname = Toplevel()'还是使用'popupname = tk.Toplevel()'。我是否将 'mainloop()' 完全排除在外,还是需要将其替换为特定于 'Toplevel()' 的内容(我在 Tkinter 文档中找不到此内容)。对缩进感到抱歉。在 stackoverflow 中粘贴我的代码时,我丢失了所有缩进并忘记修复它。 - 我马上修改。
-
如果你已经使用了
from Tkinter import *,那么你必须使用Toplevel()而不使用tk.但是如果你只使用import Tkinter as tk,那么你将不得不使用tk.Toplevel(),但也必须使用tk.Tk()和tk.Label()、tk.Button()等。它需要对代码进行更多更改,但它可以更具可读性,因为您可以使用普通的tk.Button()和主题版本ttk.Button()和自己的类Button()。
标签: python python-2.7 tkinter