我有一个功能,可以开始'完成'值和需要创建一个Spinbox小部件。值可以是十六进制或整数,增量为1.
当我得到整数时(例如:start = 1,finish = 6)它很有效。 但是当我得到十六进制值(例如:start = 0x0,finish = 0xf)时,我得到以下错误:
_tkinter.TclError: bad spinbox format specifier "%.2x"
使其迭代十六进制值的正确格式是什么? 我使用此链接作为参考nmt.edu Spinbox
代码:
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())
我还试图通过使用带有'值的'来解决这个问题。而不是from_ / to
代码:
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
此代码不会出错。但它不适用于StringVar()。按下旋转框中的向上/向下按钮不会更新旋转框显示,但是当我读取current_value
中存储的值时,会显示新值。
我做错了什么?
答案 0 :(得分:0)
格式说明符不支持%x
。来自官方的tcl / tk文档:
格式指定在使用-from和-to范围时设置字符串值时要使用的备用格式。这必须是%.f形式的格式说明符,因为它将格式化浮点数。
当我将问题底部的代码粘贴到程序中并对丢失的代码做出合理的假设时,spinbox工作正常并且StringVar
已正确更新。