2017-07-20 10 views
0

最初の回答hereを使用してGUIを作成しようとしています。私はいくつかの問題にぶち当たっています。なぜなら、すべてがどのように接続されるべきかを完全には理解できないからですPython 3、Tkinter、GUI、関数を置く場所とそれらを別のクラスから呼び出す方法

クラスを使用してボックスのグリッドを作成しています。各ボックスは、クリックするとbindを使用していくつかの関数を呼び出します。

  • ここでManyBoxesクラスを作成しますか?私がやろうとしていることの一例については、下の方を見てください。

  • MainクラスにあるMany_Boxesクラスには、私が関数にバインドするアクションがあります。どこにその機能を置くのですか?その関数をどのように呼び出すのですか? Navクラスからその関数を呼び出す場合はどうすればよいですか?

は私が持っている:

​​

答えて

0

私が正しくあなたの質問を理解していた場合は、クラスを作成する必要はありません:私はこれを置けばいい

class Nav(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 


class Main(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 
     self.parent = parent 

     self.hand_grid_dict = self.create_hand_grid() 

    class Many_Boxes: 
     <<<<<<<<< bunch of code here >>>>>>>>>>>>>> 
     self.hand_canvas.bind("<Button-1>", lambda event: button_action(canvas_hand)) <<<<<< WHAT DO I NAME THIS??? self.parent.....? 





class MainApplication(tk.Frame): 
    def __init__(self, parent): 
     tk.Frame.__init__(self, parent) 


     self.navbar = Nav(self) 
     self.main = Main(self) 


     self.navbar.pack(side="left", fill="y") 
     self.main.pack(side="right", fill="both", expand=True) 



if __name__ == "__main__": 
    root = tk.Tk() 
    MainApplication(root).grid(row=1, column=1) 
    root.mainloop() 

をボックスを作成するだけです。あなたがしなければならないのは、あなたのcreate_hand_grid機能をMany_Boxesクラスを交換し、button_action機能定義されています

import tkinter as tk 

class Navbar(tk.Frame): 
    def __init__(self, parent): 
     self.parent = parent 
     super().__init__(self.parent) 

     tk.Label(self.parent, text='Navbar').pack() 

     tk.Button(self.parent, text='Change Color', command=self.change_color).pack() 

    def change_color(self): 
     # access upwards to MainApp, then down through Main, then ManyBoxes 
     self.parent.main.many_boxes.boxes[0].config(bg='black') 

class ManyBoxes(tk.Frame): 
    def __init__(self, parent): 
     self.parent = parent 
     super().__init__(self.parent) 

     self.boxes = [] 
     self.create_boxes() 

    def button_action(self, e): 
     print('%s was clicked' % e.widget['bg']) 

    def create_boxes(self): 
     colors = ['red', 'green', 'blue', 'yellow'] 
     c = 0 
     for n in range(2): 
      for m in range(2): 
       box = tk.Frame(self, width=100, height=100, bg=colors[c]) 
       box.bind('<Button-1>', self.button_action) 
       box.grid(row=n, column=m) 
       self.boxes.append(box) 
       c += 1 

class Main(tk.Frame): 
    def __init__(self, parent): 
     super().__init__(parent) 
     self.parent = parent 

     self.many_boxes = ManyBoxes(self) 
     self.many_boxes.pack() 

class MainApp(tk.Frame): 
    def __init__(self, parent): 
     super().__init__(parent) 

     self.navbar = Navbar(self) 
     self.navbar.pack(fill=tk.Y) 

     self.main = Main(self) 
     self.main.pack(fill=tk.BOTH, expand=True) 

if __name__ == "__main__": 
    root = tk.Tk() 
    MainApp(root).pack() 
    root.mainloop() 

を私はあなたがコードを貼り付け、コピーして、それが動作を確認できcreate_hand_gridbutton_actionに充填しました。

+0

答えてくれてありがとうございましたが、読みやすくするために質問に含まれていないMany_Boxesクラスの方がはるかに多くなっています。私はすべてのクラスに入れようとしているので、GUIが本当に複雑になっているが、私は別のものを呼び出す方法の論理を取得していない。 Many_Boxオブジェクトの束を変更するボタンがナビゲーションバーにあるとします。どのようにボタンを作成するのですか?それは自己ですか、親ですか? – lessharm

+0

@lessharm私はあなたが今欲しいものを理解していると思います。私はコードを更新しました – Nelson

+0

ありがとう、それは本当に役立つ:D – lessharm

関連する問題