gpt4 book ai didi

python - Tkinter 绑定(bind)事件传递给函数而不是变量

转载 作者:行者123 更新时间:2023-12-01 07:45:18 28 4
gpt4 key购买 nike

我正在尝试为应用程序制作一个简单的颜色选择器。我正在生成一系列具有不同背景颜色的标签。单击标签时,我想将十六进制颜色放入父窗口小部件的输入字段中。

一切都正确加载,但似乎我将绑定(bind)事件实例传递给我的 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 的方法,这种方法感觉更Pythonic:

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,可能存在一些差异。

关于python - Tkinter 绑定(bind)事件传递给函数而不是变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56493559/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com