2017-04-19 17 views
-2

これは問題を示すために作成した最小の例です。大きなプロジェクトから抽出されていますので、名前を許してください。だから、基本的に私はこのようになりますGUIがあります:ボタン...tkinter:ボタンを押したときに関数が呼び出されない

enter image description here

接続ボタンと\ RP BEを常にべきナビゲータまたはタブセレクタに似ているフレーム(control_container)に属し、表示され、情報ボタンは別のフレーム(コンテナ)に属し、BE \ RP ...ボタンをクリックすると対応するフレームクラスに変更する必要があります。 Connectボタンをクリックすると、関数connectを呼び出して印刷を行うべきであるということが私を混乱させました。しかし、それは動作しません:あなたがそれをクリックすると、何も起こっていません。しかし、私はあなたが関数を削除すると文句を言うので、プログラムがconnect関数を認識することを知っています。対照的に、StartPageのinfoをクリックすると、うまく動作して印刷されます。これは本当に私にとっては奇妙です。

import tkinter as tk 
from tkinter import ttk 
from tkinter import * 



class emcAutoApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 

     tk.Tk.__init__(self, *args, **kwargs) 


     self.control_container = tk.Frame(self) 
     self.control_container.pack(side="top", fill="both", expand = True) 


     container = tk.Frame(self, width=768, height=576, bg="") 
     container.pack(side="top", fill="both", expand = True) 
     container.grid_rowconfigure(0, weight=1)  
     container.grid_columnconfigure(0, weight=1) 

     self.frames = {} 

     for F in (StartPage, BE, RP, PreScan, RSE): 
      frame = F(container, self) 
      self.frames[F] = frame 
      frame.grid(row=0, column = 0, sticky='nsew') 

     self.show_frame(StartPage) 

    def show_frame(self, cont): 

     frame = self.frames[cont] 
     frame.tkraise() 

    def get_page(self, page_class): 
     return self.frames[page_class] 


class StartPage(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 

     self.frame_controller = controller 

     #control frame starts here 
     control_frame = ttk.Frame(self.frame_controller.control_container) 
     control_frame.pack(side='top') 

     chamber_frame = Frame(control_frame, 
          borderwidth=5, 
          relief=RIDGE, 
          width=200 
         ) 
     chamber_frame.pack(side=TOP, expand=YES, fill=X) 

     chamber_frame_1 = Frame(chamber_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     chamber_frame_1.pack(side=LEFT, expand=YES, fill=X) 

     chamber_frame_2 = Frame(chamber_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     chamber_frame_2.pack(side=LEFT, expand=YES, fill=X) 


     connect_button = ttk.Button(chamber_frame_2, text="connect", command=lambda: self.connect) 
     connect_button.pack() 

     tab_frame = Frame(control_frame, 
          borderwidth=5, 
          relief=RIDGE, 
          width=500 
         ) 
     tab_frame.pack(side=TOP, expand=YES, fill=X) 

     tab_frame_1 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_1.pack(side=LEFT, expand=YES, fill=X) 

     tab_frame_2 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_2.pack(side=LEFT, expand=YES, fill=X) 

     tab_frame_3 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_3.pack(side=LEFT, expand=YES, fill=X) 

     tab_frame_4 = Frame(tab_frame, 
          borderwidth=1, 
          relief=RIDGE, 
          width=100 
         ) 
     tab_frame_4.pack(side=LEFT, expand=YES, fill=X) 

     BE_button = ttk.Button(tab_frame_1, text="BE", 
          command=lambda: self.frame_controller.show_frame(BE)) 
     BE_button.pack() 

     RP_button = ttk.Button(tab_frame_2, text="RP", 
          command=lambda: self.frame_controller.show_frame(RP)) 
     RP_button.pack() 

     PreScan_button = ttk.Button(tab_frame_3, text="PreScan", 
          command=lambda: self.frame_controller.show_frame(PreScan)) 
     PreScan_button.pack() 

     RSE_button = ttk.Button(tab_frame_4, text="RSE", 
          command=lambda: self.frame_controller.show_frame(RSE)) 
     RSE_button.pack() 


     infobutton = ttk.Button(self, text = "info", command = self.info) 
     infobutton.pack() 


    def info(self): 
     print("info") 

    def connect(self): 
     print("connected") 

class BE(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 

class RP(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 

class PreScan(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 

class RSE(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self,parent) 


     self.frame_controller = controller 


if __name__ == "__main__": 

    #=== GUI ===# 
    LARGE_FONT = ("Verdana", 12) 
    NORM_FRONT = ("Verdana", 10) 

    app = emcAutoApp() 
    app.mainloop() 
+0

例を小さくしてください。そこにはボタンを作ることとは無関係にたくさんのコードがあります。 –

+0

これはおそらく: 'command = lambda:self.connect' ....これはconnectと呼ばれていません。 。おそらく 'command = self.connect'が実行します。パラメータを追加する場合は、 'command = lambda:self.connect( 'other stuff')'を実行します。 – tdelaney

答えて

1

lambda: self.connectは接続しません。この場合、関数を直接参照するだけで、lambdaの必要はありません。一般的な経験則として、ボタンは常に関数に直接結び付けて使用するのではなく、関数に直接結合する必要があります。lambda

connect_button = ttk.Button(..., command=self.connect) 
+0

ありがとうございます!私はボタンを使って引数を指定して関数を呼び出すと、command = self.connect(arg1、arg2)はうまくいくでしょうか? –

+0

@ハンソンリ:いいえ。これは 'lambda'や' functools.partial'を使いたい時です。ここで重要なことは、ルールを記憶せずに、実際に何が必要なのかを理解することです。 'command'には_callable_を指定する必要があります。 http://stackoverflow.com/questions/111234/what-is-a-callable-in-python –

+0

ありがとう!私はそれを徹底的に調べます。 –

関連する問題