2017-09-07 19 views
0

1コンボボックスの状態に応じてコンボボックス2に異なる値を表示させたい。また、コンボボックス2は、入力ボックスの状態を変更します。私が理解できないのは、on_field_change関数が問題なく動作するのですが、check_websiteは私にTypeError: trace_variable() missing 1 required positional argument: 'callback'というエラーを与えます。どうして?助言がありますか?tkinterのトレース方法

import tkinter as tk 
from tkinter import ttk 


main = tk.Tk() 
app = tk.Frame(main) 
app.grid() 


def on_field_change(index, value, op): 
    if novel.get() in has_book_website1: 
     book_number_chosen.configure(state="enabled") 
    else: 
     book_number_chosen.configure(state="disabled") 


def check_website(index, value, op): 
    if website.get() == "Website1": 
     novel_chosen["values"] = namelist_website1 
    elif website.get() == "Website2": 
     novel_chosen["values"] = namelist_website2 


website = tk.StringVar 
website_chosen = ttk.Combobox(app, width=42, textvariable=website,       
       state="readonly") 
website.trace("w", check_website) 
website_chosen["values"] = ["Website1", "Website12"] 
website_chosen.current(0) 
website_chosen.grid(column=1, row=0) 

book_number = tk.IntVar() 
book_number_chosen = ttk.Entry(app, width=5, textvariable=book_number,    
state="disabled") 


novel = tk.StringVar() 
novel_chosen = ttk.Combobox(app, width=42, textvariable=novel, 
       state="readonly") 
novel.trace("w", on_field_change) 
novel_chosen["values"] = ["1", "2"] 
novel_chosen.grid(column=1, row=1) 
novel_chosen.current(0) 

has_book_website1 = ["2"] 

namelist_website1 = ["Just", "some", "text"] 
namelist_website2 = ["lorem", "ipsum"] 

main.mainloop() 
+0

コードの切断されたブロックの束ではなく[mcve]を作成してください。 –

+0

投稿を編集しました。急いで、白い騎士が解決策を見つけたときに戻ってくることを望んでいました。 – BloodViolet

+0

'web = tk.StringVar'行の最後に括弧がないことに気づいていますか? – CommonSense

答えて

2

あなたがwebsite = tk.StringVar代わりのwebsite = tk.StringVar()を書いたので、それは単にです。

なぜこのエラーが発生するのですか?

あなたが実際に(括弧付きの呼び出しによって作成された)ことのインスタンスにそれを割り当てる一方であなたは、tk.StringVarクラスwebsite変数を割り当てます。次のように tk.StringVar.trace方法は、多かれ少なかれに定義される:

class StringVar(...): 
    ... 
    def trace(self, mode, callback): 
     ... 

websiteのでポイントをクラスに、website.traceクラスメソッドを指します。 website.trace("w", check_website)を呼び出すとき、"w"selfとなり、check_websitemodeとなり、呼び出しには引数がありません。

websitetk.StringVarインスタンスとして定義されている一方、website.traceインスタンスメソッドを指し、そしてwebsiteは暗黙selfとして渡されます。

これらのカッコを追加すると、あなたはうまくいきます。

関連する問題