python - Tkinter 绑定事件传递给函数而不是变量
问题描述
我正在尝试为应用程序制作一个简单的颜色选择器。我正在生成一组具有不同背景颜色的标签。单击标签时,我想将十六进制颜色放入父小部件的输入字段中。
一切都正确加载,但似乎我将绑定事件实例传递给我的 set_color 方法,而不是实际的十六进制颜色。我究竟做错了什么?
我可以使用带有命令的按钮,但这些按钮需要更长的时间才能加载。
# Python 2.7
import Tkinter as tk
from tkFont import Font
import math
class ColorPicker(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.parent = parent
self.title("ColorPicker")
self.frame = tk.Frame(self)
self.frame.pack()
self.buttonfont = Font(family="Arial", size=5)
ROW, COL = 0, 0
COLORS = xrange(1, int("FFFFFF", base=16), 50000)
for color in COLORS:
hexcolor = "#" + str(hex(color))[2:]
hexcolor += "0"*(7 - len(hexcolor))
l = tk.Label(self.frame, bg=hexcolor, text=hexcolor, font=self.buttonfont)
l.bind("<Button-1>", lambda x=hexcolor: self.set_color(x))
l.grid(row=ROW, column=COL)
ROW += 1
if ROW > math.sqrt(len(COLORS)):
ROW = 0
COL += 1
def set_color(self, color):
self.parent.entry_background_color.delete(0, tk.END)
self.parent.entry_background_color.insert(0, color)
self.destroy()
这是一个运行和重现行为的小例子。
import Tkinter as tk
def p(s, *args):
print(s)
app = tk.Tk()
frame = tk.Frame(app)
frame.pack()
for i in range(3):
label = tk.Label(app, text="Press Me")
label.pack()
label.bind("<Button-1>", lambda i=i: p("Hello World {} times".format(i)))
app.mainloop()
解决方案
Bind 正在生成一个您必须在 lambda 中使用的事件:
l.bind("<Button-1>", lambda event, x=hexcolor: self.set_color(x))
# ^ ^
# consume event-------| | and then assign x
否则 lambda 会将事件分配给hexcolor
.
更新
至于标签没有响应的问题,我无法重现。然而,我确实给了它一些想法,并想出了一种分配 ROW 和 COL 的方法,感觉更像 Python:
import Tkinter as tk
import math
class ColorPicker(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.parent = parent
self.title("ColorPicker")
self.frame = tk.Frame(self)
self.frame.pack()
ROW, COL = 0, 0
COLORS = xrange(1, int("FFFFFF", base=16), 50000)
for count, color in enumerate(COLORS):
hexcolor = "#" + str(hex(color))[2:]
hexcolor += "0"*(7 - len(hexcolor))
ROW = count // int(math.sqrt(len(COLORS)))
COL = count % int(math.sqrt(len(COLORS)))
l = tk.Label(self.frame, bg=hexcolor, text=hexcolor)
l.bind("<Button-1>", lambda event, x=hexcolor: self.set_color(x))
l.grid(row=ROW, column=COL)
def set_color(self, color):
print color
root = tk.Tk()
app = ColorPicker(root)
请注意,我正在运行 Python 3.6.5,可能存在一些差异。
推荐阅读
- android - Android 8.0 设备上的 JobScheduler API 崩溃
- wampserver - 随机页面在 wamp 服务器中停止工作
- javascript - React Native Fade In Animation 不流畅
- php - 为什么我的登录代码没有从我的数据库中读取?
- css - position: absolute 导致页面溢出
- java - java在类中调用静态方法使该类成为实例化
- php - 检查月份是否大于今天的月份
- spring - 使用 Spring Boot 创建 OAuth 2.0 登录提供程序
- javascript - Ajax 请求不返回 HttpResponse
- php - Laravel + mssql 无法连接