2017-07-06 11 views
0

私は '開始'、 '終了'の値を取得し、スピンボックスウィジェットを作成する必要がある関数を持っています。値は16進数または1の増分で整数になります。Python、tkinterスピンボックスウィジェットの16進値を反復する方法

整数を取得すると(ex:start = 1、finish = 6)、大きな効果があります。 しかし、私は進値を取得する場合(例:スタート= 0x0の、仕上げ= 0xFのを)私は次のエラーを取得する:

_tkinter.TclError: bad spinbox format specifier "%.2x"

それが進値に反復させるために適切なフォーマットは何ですか? Iが基準nmt.edu Spinbox

コードとして、このリンクを使用する:

def __init__(self,parent): 
    self.master = parent 
    self.variable_dict = dict() 
    self.loop_value_frame = LabelFrame(self.master, text="Loop Variables: ", bg='white') 
    self.loop_value_frame.grid(row=3, column=0, padx=5, sticky='we') 


def add_loop_variable(self, min_value, max_value): 
    self.variable_dict["min_value"] = min_value 
    self.variable_dict["max_value"] = max_value 
    self.variable_dict["current_value"] = StringVar() 
    self.variable_dict["current_value"].set(min_value) 

def clear(self): 
    for widget in self.loop_value_frame.winfo_children(): 
     widget.destroy() 
    self.loop_value_frame.grid_forget() # remove from view 

def create_spinbox(self): 
    self.clear() # clear the frame 


    if re.match(r'^\s*(0[xX][0-9a-fA-F]+)\s*', variable_dict["min_value"]): # hex index 
     int_base = 16 
    else: # int index 
     int_base = 10 
    index_list = [index if int_base==10 else hex(index) for index in range(int(self.variable_dict["min_value"],int_base),int(self.variable_dict["max_value"],int_base)+1)]  # parse the index list 
    Spinbox(self.loop_value_frame, values=tuple(index_list), width=5, 
       textvariable = self.variable_dict["current_value"], 
       command = lambda: self.update_loop_index()) 

def update_loop_index(self): 

    # do some calculation on the new index to display 

    self.create_spinbox() # display the whole widget again 
:私も

コードに/代わりのFrom_の '値' でスピンボックスを使用してこの問題を解決しようと

def create_spinbox(self,min_value,max_value): 
    self.current_value = StringVar() 
    self.current_value.set(min_value) 

    if re.match(r'^\s*(0[xX][0-9a-fA-F]+)\s*', min_value): # hex index 
     Spinbox(self.master, 
       from_=min_value, to=max_value, width=5, 
       format='%.2x', 
       textvariable=self.corrent_value, 
       command=lambda: self.update_loop_index()) 
    else: # int index 
     Spinbox(self.master, from_=min_value, to=max_value, width=2, 
       textvariable = self.current_value, 
       command = lambda: self.update_loop_index()) 

このコードではエラーは発生しません。しかし、それはStringVar()で動作しません。スピンボックスの上/下を押すとスピンボックスの表示は更新されませんが、current_valueに保存されている値を読み取ると新しい値が表示されます。 私は何が間違っていますか?

+1

したがって、スピンボックスは値が変更されるたびに新しいスピンボックスを作成しますか?どうしてそうするか?なぜ、この潜在的に無数のスピンボックスがすべて同じ変数を使用しているのでしょうか? –

+0

ユーザがインデックスを変更するたびにウィジェットウィンドウが消去され(スピンボックスを含むすべてのtkウィジェットが消去されます)、更新された値で新しいウィジェットが作成されます。 StrignVarはプロパティであり、消去されていないので、現在のデータを保持するはずですが、デフォルト値に戻ります。 – NopkaNastia

+0

あなたが示したコードはそれをしません。 [mcve]を入力してください。しかし、私はそれを正確に再現するためにウィジェットを破壊するという点は見ません。開始値と終了値を変更する必要がある場合は、値を破棄して再作成する必要はありません。 –

答えて

0

フォーマット指定子は%xをサポートしていません。公式のTcl/Tkのドキュメントから:

format Specifies an alternate format to use when setting the string value when using the -from and -to range. This must be a format specifier of the form %.f, as it will format a floating-point number.

私はプログラムにあなたの質問の下部にコードを貼り付けし、不足しているコードについて合理的な仮定を行う場合は、スピンボックスは正常に動作してStringVarが適切に更新されます。

+0

私は2番目のコードをチェックしましたが、 'command = lambda:self.update_loop_index()'を削除するとうまく動作します。しかし、コマンドで私は問題が発生します。 'update_loop_index()'関数は 'create_spinbox'の再帰を保持します(私は投稿を編集しました)。再帰で動作させる方法はありますか? – NopkaNastia

関連する問題