2017-06-22 4 views
-1

私は一般にpythonとtkinterの新機能です。私は1年ほどぐらいプログラミングしていました。そして、それは正しい方法であると聞いたので、それぞれのウィンドウを独自のクラスにするようになってきました。トップレベルクラスの新しいインスタンスがオーバーラップウィジェットを作っています

私は、コンテンツを追加するボタンが付いたツリービューを持つプログラムを作っています。ボタンは、ユーザーが内容を入力できるようにする新しいウィンドウを開きます。私が抱えている問題は、ツリービューを更新するために最初のウィンドウをインスタンス化する必要があるときです。最初のウィンドウのすべてのウィジェットが倍増しているようです。これはそれを構築し続け、それは奇妙に見えます。

これは正常なのですか、それとも良い方法がありますか?

ありがとうございます。私は必要に応じて写真や自分のコードを投稿することができます。

編集:短縮コード

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行または2つのデータをハードコードすることができます。 –

答えて

1

あなたはNewボタンを押すたびにclass MainWindow:呼んでいます。これは、すべてのウィジェットを何度も作り直しています。 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

そうです、私はそれを考えていました。私はちょうど各ウィンドウを独自のクラスにすることに慣れようとしていました。なぜなら、人々はそれがよりきれいで使いやすいと言うからです。 –

関連する問題