python - 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()
解决方案
如果您希望在用户在 spinbox 输入字段中键入然后按回车键时更新颜色,则需要将函数绑定到<Return>
事件。
您可以创建一个接受 tkinter 自动发送的事件参数的新函数,修改现有函数以接受事件参数,或者使用lambda
或functools.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())
推荐阅读
- arrays - Hive中Presto UNNEST函数的等价物是什么
- php - update_term_meta() 没有按预期工作
- predicate - 谓词未在 foreach 循环中堆叠
- php - 表结构 PHP 矩阵网格
- c# - 如何在异步环境中正确使用 Fire&Forget
- prometheus - Prometheus - 匹配除一个以外的所有指标
- laravel - Spatie 媒体库 - 当前请求在名为 `pic` 的键中没有文件
- vue.js - 克隆和复制 vuex 存储状态时刻日期
- angular - 如何在没有订阅和嵌套 Observables 的情况下从 Firebase 检索数据?
- client-server - 客户端-服务器应用程序中的语音识别