首页 > 解决方案 > Python tkinter spinbox 中的箭头按钮使用 textvariable 但不使用 Return 键更新标签的颜色和文本

问题描述

我在常见问题解答中查找了我的问题并找到了一些提示。但他们无法解决我的问题。因此这是我的问题:

我在 Python 3.8 中编写了一个 GUI,它使用三个旋转框来表示 RGB 颜色的 3 个值。在开始时,它以灰色显示三个值(127、127、127)。右侧的两个标签显示颜色和十六进制值。

通过使用旋转框的两个箭头按钮并按住它们,两个实验室的颜色和十六进制值将同时改变。

我的问题是“返回”键不更新颜色和十六进制值,因为它们没有以正常方式使用 textvariable 和 StringVar()。

必须在显示之前生成十六进制值,并且必须在更新函数中设置标签的颜色。

这就是我认为“返回”键不起作用的问题。

我还为旋转框使用了绑定选项,它不会立即更新在字段中手动输入后的值并按下 Reurn 键。

在我使用旋转框的箭头按钮或键盘上的箭头键后,它会更改标签的颜色和十六进制值。

如果您有任何想法或看到我在哪里做错了步骤,我们将不胜感激。

这是说明问题的代码:

from tkinter import *

root = Tk()

val_str = StringVar()

color_bg = ['red', 'green', 'blue', 'black', 'orange', 'cyan']
color_fg = ['white', 'yellow', 'cyan', 'white', 'blue', 'red']

def update_val():
    global val_str, fg_col, bg_col

    var_int = int(spin.get())
    val_str.set(str(var_int))

    label['bg'] = color_bg[(var_int%6)-1]
    label['fg'] = color_fg[(var_int%6)-1]

spin = Spinbox(root,
               from_=1,
               to=100,
               width=10,
               textvariable=val_str,
               command=update_val,
               font='Helvetica 30 bold',
               justify=CENTER,
               fg='red',
               bg='yellow')
spin.pack()

label = Label(root,
              width=10,
              textvariable=val_str,
              font='Helvetica 30 bold',
              fg='red',
              bg='white')
label.pack()

root.mainloop()

标签: pythonpython-3.xtkinter

解决方案


如果您希望在用户在 spinbox 输入字段中键入然后按回车键时更新颜色,则需要将函数绑定到<Return>事件。

您可以创建一个接受 tkinter 自动发送的事件参数的新函数,修改现有函数以接受事件参数,或者使用lambdafunctools.partial接受并忽略该参数。

以下是修改现有函数的方法:

def update_val(event=None):
    global val_str, fg_col, bg_col

    var_int = int(spin.get())
    val_str.set(str(var_int))

    label['bg'] = color_bg[(var_int%6)-1]
    label['fg'] = color_fg[(var_int%6)-1]
...
spin.bind("<Return>", update_val)

以下是如何在lambda不修改的情况下使用update_val

spin.bind("<Return>", lambda event: update_val())

推荐阅读