2016-07-12 40 views
1
from Tkinter import * 
import random 
menu = Tk() 
subpage = Tk() 
entry_values = [] 
population_values = [] 
startUpPage = Tk() 

def main_menu(window): 

    window.destroy() 
    global menu 
    menu = Tk() 
    frame1 = Frame(menu) 
    menu.resizable(width=FALSE, height=FALSE) 
    button0 = Button(menu, text="Set Generation Zero Values", command=sub_menu(menu)) 
    button1 = Button(menu, text="Display Generation Zero Values") 
    button2 = Button(menu, text="Run Model") 
    button3 = Button(menu, text="Export Data") 
    button4 = Button(menu, text="Exit Program", command=menu.destroy) 

    button0.grid(row=0, column=0, sticky=W) 
    button1.grid(row=2, column=0, sticky=W) 
    button2.grid(row=3, column=0, sticky=W) 
    button3.grid(row=4, column=0, sticky=W) 
    button4.grid(row=5, column=0, sticky=W) 

    menu.mainloop() 

def sub_menu(window): 
    global subpage 
    window.destroy() 
    subpage = Tk() 
    subpage.resizable(width=FALSE, height=FALSE) 

    #defining sub page items 
    button5 = Button(subpage, text="Save Generation Data",command = main_menu(subpage)) 



    juveniles_label0 = Label(subpage,text="Juveniles") 
    adults_label1 = Label(subpage,text="Adults") 
    seniles_label2 = Label(subpage,text="Seniles") 
    population_label3 = Label(subpage,text="Popultation") 
    survival_rate_label4 = Label(subpage,text="Survival Rate (Between 0 and 1)") 

    entry0 = Entry(subpage) 
    entry1 = Entry(subpage) 
    entry2 = Entry(subpage) 
    entry3 = Entry(subpage) 
    entry4 = Entry(subpage) 
    entry5 = Entry(subpage) 

    button4.grid(row=1, column= 6, sticky=E) 

    juveniles_label0.grid(row=0, column=1) 
    adults_label1.grid(row=0, column=2) 
    seniles_label2.grid(row=0, column=3) 
    population_label3.grid(row=1, column=0) 
    survival_rate_label4.grid(row=2, column=0) 

    entry0.grid(row=1, column=1) 
    entry1.grid(row=1, column=2) 
    entry2.grid(row=1, column=3) 
    entry3.grid(row=2, column=1) 
    entry4.grid(row=2, column=2) 
    entry5.grid(row=2, column=3) 
    #add entry 6 7 8 
    subpage.mainloop() 

main_menu(subpage) 
main_menu(startUpPage) 

我很新的編碼和計算器。我正在嘗試創建一個GUI,它具有首先打開的主頁面和一個將通過單擊將存儲在主頁面中的按鈕打開的子頁面。我的問題是,我不知道爲什麼它不打開我的主頁。我的想法是,這與.destroy()或類似的東西有關。任何幫助將非常感激。tkinter(不知道我的錯誤可能是由於.destroy())

回答

1

作爲一般規則,您應該創建一個Tk一個實例爲您的程序的生命。這就是Tkinter設計用於的方式。當你瞭解其背後的理由時,你可以打破這條規則,儘管破壞規則的理由很少。

最簡單的解決方案是將您的主菜單和子菜單實現爲框架,您已經完成。要在它們之間切換,您可以簡單地銷燬一個並(重新)創建另一個,或者提前創建它們,然後刪除一個並顯示另一個。

例如,下面的示例顯示如何提前創建它們並將其交換出來。關鍵是每個功能都需要返回保存在字典中的幀。字典用於映射符號名稱(例如:"main","sub"等)到實際的幀。

def main_menu(root): 
    menu = Frame(root) 
    button0 = Button(menu, text="Set Generation Zero Values", 
        command=lambda: switch_page("sub")) 
    ... 
    return menu 

def sub_menu(root): 
    subpage = Frame(root) 
    button5 = Button(subpage, text="Save Generation Data", 
        command = lambda: switch_page("main")) 
    ... 
    return subpage 

def switch_page(page_name): 
    slaves = root.pack_slaves() 
    if slaves: 
     # this assumes there is only one slave in the master 
     slaves[0].pack_forget() 
    pages[page_name].pack(fill="both", expand=True) 

root = Tk() 
pages = { 
    "main": main_menu(root), 
    "sub": sub_menu(root), 
    ... 
} 

switch_page("main") 
root.mainloop() 

對於更復雜的面向對象的方法看Switch between two frames in tkinter

+0

這是很好的想法,很好做完了 –

+0

這裏有一些我不太瞭解的代碼。我猜奴隸是子頁/子窗口,但我仍然不完全明白,如果奴隸: #這假設只有一個奴隸在主人 奴隸[0] .pack_forget() 頁[page_name]。 pack(fill =「both」,expand = True) – 2C00L4U

1

繼承人一些代碼,你想要做什麼..做一個窗口,摧毀它被點擊按鈕時,然後作出一個新的窗口......

from Tkinter import * 
import random 


def main_menu(): 
    global root 
    root = Tk() 
    b = Button(root,text='our text button',command = next_page) 
    b.pack() 

def next_page(): 
    global root,parent 
    parent = Tk() 
    root.destroy() 
    new_b = Button(parent,text = 'new Button',command=print_something) 
    new_b.pack() 

def print_something(): 
    print('clicked') 


main_menu() 
root.mainloop() 
parent.mainloop() 

PS。我在python3中做了這個,所以請記住,雖然它不會在我看來是一個問題

+1

的是它使用一個以上的Tkinter的對象好的做法呢?使用* root *代替所有函數不是更好嗎? –

+0

你可以使用Toplevel,但我不知道它是否會在這裏服務我們的目的,因爲Toplevel是根的methinks的孩子,它將被破壞的根,檢查出來併發布結果 –

+1

你不需要調用'root.update()'的任何一個。 –

相關問題