Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.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_Python 3.x_Tkinter - Fatal编程技术网

Python 标签上的Tkinter标签

Python 标签上的Tkinter标签,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,将tkinter与Python 3结合使用 我有一个框架,当我单击该框架时,我将回调函数绑定到该框架,但是当我将小部件放置在该框架中时,它们不会响应单击。因此,我想将它们绑定到与父帧相同的回调函数,以便在帧中的任何位置单击都可以工作。有没有一种方法可以将标签分配给标签小部件,这样我就可以执行frame.tag_bind()并一次绑定所有子小部件?帧是否有.tag_bind()方法?或者我必须单独绑定所有小部件吗 下面是一些针对当前情况的简化代码 import tkinter as tk cla

将tkinter与Python 3结合使用

我有一个框架,当我单击该框架时,我将回调函数绑定到该框架,但是当我将小部件放置在该框架中时,它们不会响应单击。因此,我想将它们绑定到与父帧相同的回调函数,以便在帧中的任何位置单击都可以工作。有没有一种方法可以将标签分配给标签小部件,这样我就可以执行frame.tag_bind()并一次绑定所有子小部件?帧是否有.tag_bind()方法?或者我必须单独绑定所有小部件吗

下面是一些针对当前情况的简化代码

import tkinter as tk

class Window():
    def __init__(self, master):
        master.geometry('100x100')
        frame = tk.Frame(master)
        frame.pack(fill='both', expand=1)
        frame.bind('<Button-1>', self.callback)
        label = tk.Label(frame, text='Label')
        label.pack()

    def callback(self, event):
        print(event.x)

root = tk.Tk()
Window(root)
root.mainloop()
将tkinter作为tk导入
类窗口():
定义初始(自我,主):
主几何(“100x100”)
帧=传统帧(主帧)
frame.pack(fill='both',expand=1)
frame.bind(“”,self.callback)
label=tk.label(框架,text='label')
label.pack()
def回调(自身、事件):
打印(event.x)
root=tk.tk()
窗口(根)
root.mainloop()
---编辑---

我的实际代码有多个框架,所以绑定都不起作用。

正如您提到的,GUI中有多个
框架
小部件,您可以使用以下方法

使用
frame\u widget.winfo\u children()
获取
frame\u widget
内部的
子widget,然后向每个子widget发出
回调

为了直观地理解我使用的方法,我在您发布的代码中添加了另一个框架小部件

代码如下:

将tkinter作为tk导入
类窗口():
定义初始(自我,主):
主几何(“100x100”)
#---第1帧--#
frame1=tk.Frame(master,bg='blue')
frame1.pack(fill='both',expand=1)
frame1.bind(“”,self.callback)
label1=tk.Label(frame1,text='frame1'中的标签1〕
标签1.pack()
label2=tk.Label(frame1,text='frame1'中的标签2')
标签2.pack()
#您可以在框架内获取子窗口小部件并设置回调
对于frame1.winfo_children()中的child_小部件:
child_widget.bind(“”,self.callback)
#---第1帧--#
#---第2帧--#
frame2=tk.Frame(主框架,背景为白色)
frame2.pack(fill='both',expand=1)
#frame2.bind(“”,self.callback)
label1=tk.Label(frame2,text='frame2'中的标签1〕
标签1.pack()
label2=tk.Label(frame2,text='frame2'中的标签2')
标签2.pack()
#---第2帧--#
def回调(自身、事件):
打印(event.x)
root=tk.tk()
窗口(根)
root.mainloop()

因此,
frame 1
的颜色是
blue
,而
frame 2
的颜色是
white

现在,您可以单击
第1帧
中的任何位置,包括
子窗口小部件
,并触发分配的
回调
。另一方面,帧2根本没有分配任何回调


我试着用一些理论来解释。我希望有帮助

您可以通过向
窗口
类添加
标记绑定()
函数来模拟
标记绑定(…)
效果,并将属性
标记
分配给
窗口
实例的子小部件:

import tkinter as tk

class Window(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.bind('<Button-1>', self.callback)

    def callback(self, event):
        print(event.x)

    def tag_bind(self, tag, callback=None):
        for child in self.winfo_children():
            if hasattr(child, 'tag') and child.tag == tag:
                child.bind('<Button-1>', callback if callback else self.callback)

root = tk.Tk()

win = Window(root, bg='yellow')
win.pack(fill=tk.BOTH, expand=1)

lbl1 = tk.Label(win, text='Label')
lbl1.tag = 'label'  # assign a tag to this label
lbl1.pack()

lbl2 = tk.Label(win, text='Blocked')
lbl2.pack()

lbl3 = tk.Label(win, text='Passed')
lbl3.tag = 'passed'  # assign another tag to this label
lbl3.pack()

win.tag_bind('label') # bind to default internal callback
win.tag_bind('passed', lambda e: print('passed')) # bind to external callback

tk.Frame(root, width=100, height=100, bg='blue').pack()

root.mainloop()
将tkinter作为tk导入
类窗口(tk.Frame):
定义初始值(self、master、*args、**kwargs):
super()。\uuuuu init\uuuuu(主参数,*args,**kwargs)
self.bind(“”,self.callback)
def回调(自身、事件):
打印(event.x)
def tag_bind(self、tag、callback=None):
用于自个儿。winfo_children():
如果hasattr(child,'tag')和child.tag==tag:
bind(“”,如果回调,则回调,否则为self.callback)
root=tk.tk()
win=窗口(根,bg='yellow')
win.pack(fill=tk.BOTH,expand=1)
lbl1=tk.Label(win,text='Label')
lbl1.tag='label'#为此标签分配一个标记
lbl1.pack()
lbl2=tk.Label(win,text='Blocked')
lbl2.pack()
lbl3=tk.Label(win,text='Passed')
lbl3.tag='passed'#将另一个标记分配给此标签
lbl3.pack()
win.tag_bind('label')#绑定到默认的内部回调
win.tag_bind('passed',lambda e:print('passed'))#绑定到外部回调
tk.Frame(根,宽度=100,高度=100,bg='blue').pack()
root.mainloop()
您可以修改
标记绑定()
函数以满足您的需求