【问题标题】:Tkinter Entry widget stays empty in larger programs (Python 2)Tkinter Entry 小部件在较大的程序中保持为空(Python 2)
【发布时间】: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


【解决方案1】:

我无法运行您的大型程序 - 可能您的缩进有误。

我看到两个问题:

  • 程序应该只有一个mainloop() - 这可能是你的问题。
  • 我们使用Tk()创建主窗口,使用Toplevel()创建其他窗口。

除了您使用名称getname 作为函数名和第二个窗口实例之外,因此非常具有误导性。

我创建了全局 var_name 来保留名称,后来我在函数中使用它。

from Tkinter import *

def get_name(usertype):

    win = Toplevel()
    win.title("Get name popup")

    f = LabelFrame(win, text = "Your name:")
    f.pack()

    # use global `name` which was created outside function
    e = Entry(win, textvariable=var_name)
    e.pack(side="right")
    e.bind("<Return>", lambda event: win.destroy())

    b = Button(win, text = "Cancel", command=win.destroy)
    b.pack()

# --- main --

root = Tk()
root.title("Ask-name-SUB")

# global variable
var_name = StringVar()

b = Button(root, text="Enter your name", command=lambda: get_name("testuser"))
b.pack()

b = Button(root, text="Cancel", command=root.destroy)
b.pack()

root.mainloop()

# --- after --
name = var_name.get()
print "Print name, its length, its type"
print name, len(name), type(name)

编辑:

为了使弹出窗口更加通用,您可以使用参数 - 显示的文本和结果变量。

def get_value(text, variable):

然后您可以将它与不同的文本和不同的变量一起使用 - 即。姓名或地址。

from Tkinter import *

def get_value(text, variable):

    win = Toplevel()
    win.title("Get value")

    f = LabelFrame(win, text=text)
    f.pack()

    e = Entry(win, textvariable=variable)
    e.pack(side="right")
    e.bind("<Return>", lambda event: win.destroy())

    b = Button(win, text = "Cancel", command=win.destroy)
    b.pack()

# --- main --

root = Tk()
root.title("Ask-name-SUB")

# global variables
var_name = StringVar()
var_address = StringVar()

b = Button(root, text="Enter your name", command=lambda: get_value("Your name:", var_name))
b.pack()

b = Button(root, text="Enter your address", command=lambda: get_value("Your address:", var_address))
b.pack()

b = Button(root, text="Cancel", command=root.destroy)
b.pack()

root.mainloop()

# --- after --

name = var_name.get()
print "Print name, its length, its type"
print name, len(name), type(name)

address = var_address.get()
print "Print address, its length, its type"
print address, len(address), type(address)

【讨论】:

  • 非常感谢 Furas,我花了一段时间才彻底理解它,但现在我想我明白了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2012-02-16
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
相关资源
最近更新 更多