2016-12-03 21 views
-1

我想要在那里,点击按钮后,用户被要求提供它的名字,之后程序继续执行程序空。我坚持让弹出式窗口返回已经在弹出窗口中输入的文本字符串。起初我认为这是我的代码,但我决定制作第二个程序,它只是询问名称,打印它,打印它的长度和类型。在第二个方案中,一切都按照它应该的那样工作。我很难弄清楚为什么它不在第一个(较大的)程序中。我已经阅读(Why is Tkinter Entry's get function returning nothing?)和,即使我.mainloop发生后我.get()功能,但它仍然无法正常工作;在同一个线程中,他们建议使用类,这是我完全不知道的。如果可能的话,任何人都可以指出我在我的大型项目中缺少的东西?Tkinter的Entry组件保持在较大的程序(Python的2)


大项目


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") 
+0

较大的程序不工作对我来说 - 你定义函数'getname',你使用它的小部件,因为你认为你有'的getName = TK()',但它是不对。 – furas

+0

BTW:我们使用'Tk()'来创建唯一的主窗口。如果你需要弹出/对话框窗口然后使用'Toplevel()' – furas

+0

BTW:可能你的大程序有错误的缩进 - 但我认为问题是因为程序应该只有一个'mainloop()'(并且只有一个'Tk()'作为主窗口) – furas

回答

0

我不能运行大型程序 - 可能是你有错的凹痕。

我看到两个问题:

  • 程序应该只有一个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): 

然后你可以使用它与不同的文本和不同的变量 - 即。姓名或地址。因为你惹的名字`getname`

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) 
+0

非常感谢Furas,我花了一段时间才彻底了解它,但现在我认为我做到了! –

相关问题