2017-06-22 31 views
-1

我通常是python和tkinter的新手。我一直在編程大約一年左右,而且我剛開始嘗試讓每個tkinter窗口都是自己的課程,因爲我聽說這是正確的做法。頂級類的新實例使重疊的小部件

我正在製作一個程序,其中我有一個樹形視圖並帶有一個按鈕來添加內容。該按鈕打開一個允許用戶輸入內容的新窗口。我遇到的問題是,當我必須實例化第一個窗口來更新樹視圖時,它似乎將第一個窗口上的所有窗口小部件加倍。這導致它繼續建設,它看起來很奇怪。

這是正常還是有更好的方法來做到這一點?

謝謝。如有必要,我可以張貼圖片或我的代碼。

編輯:縮短代碼

from tkinter import * 
from tkinter import ttk 


class MainWindow: 
    Items = {'test': ['Material', '500']} 
    def __init__(self, master): 
     self.master = master 

     self.style = ttk.Style() 
     self.style.configure('TLabel', font=12) 

     ttk.Label(self.master, text="Items").grid(row=0, column=0, columnspan=3) 

     self.frmItems = ttk.Frame(self.master) 
     self.frmItems.grid(row=1, column=0, padx=5, pady=5, columnspan=3) 

     self.treeItems = ttk.Treeview(self.frmItems, columns=(0, 1, 2)) 
     self.treeItems.column('#0', width=0, minwidth=0) 
     self.treeItems.column(1, width=80) 
     self.treeItems.column(2, width=80) 
     self.treeItems.heading(0, text="Name") 
     self.treeItems.heading(1, text="Type") 
     self.treeItems.heading(2, text="Price") 
     self.treeItems.grid(row=0, column=0) 

     self.itemscroll = ttk.Scrollbar(self.frmItems, command=self.treeItems.yview) 
     self.itemscroll.grid(row=0, column=1, sticky='ns') 
     self.treeItems.config(yscrollcommand=self.itemscroll.set) 

     ttk.Button(self.master, text="New", command=self.item_input_show).grid(row=2, column=0, padx=5, pady=5, 
                       sticky='e') 
     ttk.Button(self.master, text="Edit").grid(row=2, column=1, padx=5, pady=5) 
     ttk.Button(self.master, text="Remove").grid(row=2, column=2, padx=5, pady=5, sticky='w') 

    def item_input_show(self): 
     ItemInput(self.master) 


class ItemInput: 
    def __init__(self, master): 
     self.master = master 
     self.MainWindow = MainWindow(master) 

     self.topItemInput = Toplevel(self.master) 
     self.topItemInput.title("Input Item Properties") 


def main(): 
    root = Tk() 
    MainWindow(root) 
    root.mainloop() 

if __name__ == "__main__": 
    main() 
+1

這是不正常的。你的代碼正在做一些事情來做這件事。沒有我們能夠看到再現問題的代碼,我們無法提供幫助。請閱讀並遵循以下建議:[mcve] –

+0

我添加了代碼。對不起,我不能縮短它。我不確定是什麼原因造成的,但是這是我在特定程序中做錯了的事情。 –

+0

請縮短它。這裏有太多不相關的代碼。例如,如果問題出現在小部件的外觀上,則不需要執行實際轉換的代碼。另外,不應該需要從文件讀取數據;例如,您可以對一行或兩行數據進行硬編碼。 –

回答

1

你每次打電話class MainWindow:按下New按鈕。這是一遍又一遍地重新制作所有的小部件。而且他們創建MainWindow的方式正在影響您如何與MainWindow進行交互。

變化:

def main(): 
    root = Tk() 
    MainWindow(root) 
    root.mainloop() 

if __name__ == "__main__": 
    main() 

要:

if __name__ == "__main__": 
    root = Tk() 
    main = MainWindow(root) 
    root.mainloop() 

一旦你做了這些改變,你能與實例交互屬性和main

下面的方法是修改版的代碼。當您按下我添加到TopLevel窗口的按鈕時,您會注意到它將打印來自main變量的屬性和方法的信息。它還會在MainWindow的輸入框中放置一些文本。

from tkinter import * 
from tkinter import ttk 

class MainWindow: 
    def __init__(self, master): 
     self.master = master 
     self.btn = ttk.Button(self.master, text="New", command=self.item_input_show) 
     self.btn.pack(side = TOP) 
     self.entry = Entry(self.master) 
     self.entry.pack(side = BOTTOM) 
     self.numbers = 200 

    def two_plus_x(self, x): 
     math = 2 + x 
     return math 

    def item_input_show(self): 
     ItemInput(self.master) 


class ItemInput: 
    def __init__(self, master): 
     self.master = master 
     self.topItemInput = Toplevel(master) 
     self.btn = ttk.Button(self.topItemInput, text="Use method in MainWindow", command = self.do_something_from_main) 
     self.btn.pack() 

    def do_something_from_main(self): 
     print(main.numbers) 
     print(main.two_plus_x(10)) 
     main.entry.delete(0, END) 
     main.entry.insert(0, "From ItemInput Class") 

# notice I removed def main(): as it was preventing us from interacting with the main variable. 
if __name__ == "__main__": 
    root = Tk() 
    main = MainWindow(root) 
    root.mainloop() 
+0

我必須從ItemInput類中的MainWindow類中運行方法 –

+0

是否有理由使用2個單獨的類?您可以將頂層窗口放在MainWindow的一個方法中。 –

+0

是的,我正在考慮這一點。我只是習慣於讓每個窗口都是自己的類,因爲人們說它更簡潔,更易於與 –