2016-12-03 18 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,我花了一段時間才徹底瞭解它,但現在我認爲我做到了! –

相關問題