Python,如何在tkinter spinbox小部件中迭代十六进制值

时间:2017-07-06 08:45:16

标签: python python-3.x tkinter

我有一个功能,可以开始'完成'值和需要创建一个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中存储的值时,会显示新值。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

格式说明符不支持%x。来自官方的tcl / tk文档:

  

格式指定在使用-from和-to范围时设置字符串值时要使用的备用格式。这必须是%.f形式的格式说明符,因为它将格式化浮点数。

当我将问题底部的代码粘贴到程序中并对丢失的代码做出合理的假设时,spinbox工作正常并且StringVar已正确更新。