如何为 PanedWindow 的每个窗格中包含的每个按钮定义特定命令?
How to define specific commands for each button included in each pane of a PanedWindow?
我想创建一个具有可变数量窗格的 PanedWindow,其中每个窗格都包含一个标签和一个按钮。按下窗格中的按钮应将消息写入该窗格中的相应标签。
我试过这段代码:
from tkinter import *
from tkinter import ttk
n = 5
root = Tk()
root.geometry('250x500+100+100')
p = ttk.Panedwindow(root, orient=VERTICAL)
p.grid(column=0, row=0, sticky=(N, S, W, E))
for i in range(n):
pane = ttk.Labelframe(p, width=25, borderwidth=0)
p.add(pane)
def writeToLabel():
paneLabel.config(text='This is Pane number %d' %(i+1))
paneLabel = ttk.Label(pane, width=20, relief='solid')
paneButton = ttk.Button(pane, text='Press', command=writeToLabel)
paneButton.grid(column=0, row=0, padx=5)
paneLabel.grid(column=1, row=0, padx=5)
root.rowconfigure(0, weight=1)
root.mainloop()
但无论按下哪个按钮,最后一行的标签都会设置消息。
如果有人能帮助我解决问题,我将不胜感激。
我认为这就是您正在寻找的东西:
from tkinter import *
from tkinter import ttk
n = 5
root = Tk()
root.geometry('250x500+100+100')
p = ttk.Panedwindow(root, orient=VERTICAL)
p.grid(column=0, row=0, sticky=(N, S, W, E))
def writeToLabel(pl, i):
pl.config(text='This is Pane number %d' %(i+1))
for i in range(n):
pane = ttk.Labelframe(p, width=25, borderwidth=0)
p.add(pane)
paneLabel = ttk.Label(pane, width=20, relief='solid')
paneButton = ttk.Button(pane, text='Press', command=lambda pl=paneLabel, i=i: writeToLabel(pl, i))
paneButton.grid(column=0, row=0, padx=5)
paneLabel.grid(column=1, row=0, padx=5)
root.rowconfigure(0, weight=1)
root.mainloop()
您当前的方法不起作用,因为 writeToLabel
的定义将使用 paneLabel
和 i
的最后一个值。相反,您需要使用 lambda 函数传递对标签的引用和 i
的值。对 lambda 函数的 pl=paneLabel
和 i=i
部分进行了解释 here.
我想创建一个具有可变数量窗格的 PanedWindow,其中每个窗格都包含一个标签和一个按钮。按下窗格中的按钮应将消息写入该窗格中的相应标签。 我试过这段代码:
from tkinter import *
from tkinter import ttk
n = 5
root = Tk()
root.geometry('250x500+100+100')
p = ttk.Panedwindow(root, orient=VERTICAL)
p.grid(column=0, row=0, sticky=(N, S, W, E))
for i in range(n):
pane = ttk.Labelframe(p, width=25, borderwidth=0)
p.add(pane)
def writeToLabel():
paneLabel.config(text='This is Pane number %d' %(i+1))
paneLabel = ttk.Label(pane, width=20, relief='solid')
paneButton = ttk.Button(pane, text='Press', command=writeToLabel)
paneButton.grid(column=0, row=0, padx=5)
paneLabel.grid(column=1, row=0, padx=5)
root.rowconfigure(0, weight=1)
root.mainloop()
但无论按下哪个按钮,最后一行的标签都会设置消息。
如果有人能帮助我解决问题,我将不胜感激。
我认为这就是您正在寻找的东西:
from tkinter import *
from tkinter import ttk
n = 5
root = Tk()
root.geometry('250x500+100+100')
p = ttk.Panedwindow(root, orient=VERTICAL)
p.grid(column=0, row=0, sticky=(N, S, W, E))
def writeToLabel(pl, i):
pl.config(text='This is Pane number %d' %(i+1))
for i in range(n):
pane = ttk.Labelframe(p, width=25, borderwidth=0)
p.add(pane)
paneLabel = ttk.Label(pane, width=20, relief='solid')
paneButton = ttk.Button(pane, text='Press', command=lambda pl=paneLabel, i=i: writeToLabel(pl, i))
paneButton.grid(column=0, row=0, padx=5)
paneLabel.grid(column=1, row=0, padx=5)
root.rowconfigure(0, weight=1)
root.mainloop()
您当前的方法不起作用,因为 writeToLabel
的定义将使用 paneLabel
和 i
的最后一个值。相反,您需要使用 lambda 函数传递对标签的引用和 i
的值。对 lambda 函数的 pl=paneLabel
和 i=i
部分进行了解释 here.