Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter绑定事件传递给函数而不是变量_Python_Tkinter - Fatal编程技术网

Python Tkinter绑定事件传递给函数而不是变量

Python Tkinter绑定事件传递给函数而不是变量,python,tkinter,Python,Tkinter,我正在尝试为应用程序制作一个简单的颜色选择器。我正在生成具有不同背景颜色的标签数组。单击标签时,我想将十六进制颜色放入父窗口小部件的输入字段中 所有内容都正确加载,但似乎我正在将绑定事件实例传递给我的set_color方法,而不是实际的十六进制颜色。我做错了什么 我可以在命令中使用按钮,但加载这些按钮需要更长的时间 # Python 2.7 import Tkinter as tk from tkFont import Font import math class ColorPicker(tk

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

所有内容都正确加载,但似乎我正在将绑定事件实例传递给我的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()
#Python 2.7
将Tkinter作为tk导入
从tkFont导入字体
输入数学
类颜色选择器(tk.Toplevel):
定义初始化(自身,父级):
tk.Toplevel.\uuuuu init\uuuuuuuu(自,父)
self.parent=parent
self.title(“颜色选择器”)
self.frame=tk.frame(self)
self.frame.pack()
self.buttonfont=Font(family=“Arial”,size=5)
行,列=0,0
颜色=xrange(1,int(“FFFFFF”,base=16),50000)
对于颜色中的颜色:
hexcolor=“#”+str(hex(color))[2:]
hexcolor+=“0”*(7-透镜(hexcolor))
l=tk.Label(self.frame,bg=hexcolor,text=hexcolor,font=self.buttonfont)
l、 绑定(“,lambda x=hexcolor:self.set_color(x))
l、 网格(行=行,列=列)
行+=1
如果行>数学sqrt(len(COLORS)):
行=0
COL+=1
def设置颜色(自身,颜色):
self.parent.entry\u background\u color.delete(0,tk.END)
self.parent.entry\u background\u color.insert(0,color)
自我毁灭
下面是一个运行和复制行为的小示例

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()
将Tkinter作为tk导入
def p,*参数:
印刷品
app=tk.tk()
frame=tk.frame(应用程序)
frame.pack()
对于范围(3)中的i:
label=tk.label(应用程序,text=“按我”)
label.pack()
label.bind(“,lambda i=i:p(“helloworld{}times.format(i)))
app.mainloop()

绑定正在生成一个事件,您必须在lambda中使用该事件:

l.bind("<Button-1>", lambda event, x=hexcolor: self.set_color(x))
#                             ^         ^
#         consume event-------|         | and then assign x

请注意,我正在运行Python3.6.5,可能存在一些差异

太棒了。但由于某些原因,标签数组中的前两行处于非活动状态。当我点击一个标签时,它实际上会从标签上两行拾取颜色。真奇怪。你认为这可能是一个明显的原因吗?啊…,对不起;我在路上喝啤酒。所以我明天才去看。试着开始一个新的问题,也许其他人会有答案。我同意你的计划。
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)