2017-09-29 22 views
1

私はこのような理由でテストアプリを作った。私はButtonRelease-1イベントコールを別のファイルの中で呼び出そうとしています。私はアプリケーションを実行しようとするときに構文を取得しています。tkinterの別のモジュールからイベントを呼び出す方法

例外TypeError:ListBのは()これはかなり海峡前方構文ですが、私は、この特定の状況でそれを修正することはできません正確に2つの引数(与えられた1)

をとります。私は基本的にイベントをクリックした情報を印刷させるだけです。他のファイル内の関数がイベントを再調整していないので、それは機能していないイベントです。

とにかく、このコードを修正してうまく動作するようにします。関数は別のファイルにとどまっていなければなりません。これは、同じファイルにあってもできない場合は簡単です。

start.py

from Tkinter import * 
import example_funcs as EF 


class Page_three(Frame): 

    def __init__(self): 
     Frame.__init__(self) 
     self.pack() 
     self.listboxs() 

    def listboxs(self): 
     self.z = Listbox(self) 
     self.z.grid() 
     for item in range(1,10): 
      self.z.insert(END, item) 
     self.z.bind("<ButtonRelease-1>", EF.listb(self)) 

root = Tk() 
app = Page_three() 
app.mainloop() 

example_funcs.py変数は、関数の内部呼び出すことができるように、自己が使用されている

from Tkinter import * 
import Tkinter as tk 

def listb(self, event): 
    selection = self.z.curselection() 
    print selection 

インスタンスとしての自己を呼び出していない場合は、それが見つからないの構文を持っています私のリストボックス変数。

+0

これはあまりにも多くのコードです。これを[mcve]に減らしてみてください。 –

+0

@BryanOakleyは、今回は非常に短くしました。 – ricky6991

答えて

1

EF.listb(self)を渡すことは、あなたがしたいことをしません。部分的には、呼び出し元のインスタンスにselfパラメータをバインドしていないので、コールバックによってeventパラメータを入力します。代わりに、関数はただちに呼び出されます(bind呼び出しが行われる前)、間違った数の引数を使用するとエラーが発生します。

この問題を解決する方法はいくつかあります。

1つのオプションは、手動でfunctools.partialを使用してlistb機能へselfパラメータをバインドするために、次のようになります。

import example_funcs as EF 
import functools 

class Page_three(Frame): 
    ... 
    def listboxs(self): 
     ... 
     self.z.bind("<ButtonRelease-1>", functools.partial(EF.listb, self)) # bind self 

別のアプローチは、あなたのようにそれを参照できるように、あなたのクラスでlistb実際のメソッドを作成することです方法はselfです。それは次のようになります。しかし他の場所で使用されていない

import example_funcs as EF 

class Page_three(Frame): 
    ... 
    def listboxs(self): 
     ... 
     self.z.bind("<ButtonRelease-1>", self.listb) # refer to a method without calling it 

    listb = EF.listb # add the function from the other module as a method on this class 

listb場合は、別のモジュールでそれを定義し、かなり愚かなことでしょう、ここでそれを上にコピーします。事実の後で定義をこのクラスに追加するのではなく、定義をこのクラスに移すだけです。一方、listbがいくつかの異なるクラスで使用されている場合、そのクラスは1つの定義への参照を厳密にコピーするのではなく、ある種の継承を使用してメソッドを共有する必要があることを示します。

+0

functoolsモジュールはうまく機能しました。ありがとうございました。 – ricky6991

関連する問題