如何在 tkinter 比例小部件中调用函数并传递变量?
How to call a function and pass variable in tkinter scale widget?
我正在尝试使用 tkinter 缩放小部件来增加或减小 canvas 上的标签小部件文本大小。我正在使用比例小部件变量值来这样做。单击按钮时文本大小会发生变化(my_btn),但我希望它发生变化,我想通过向左或向右拖动比例小部件来增加或减小文本大小。当我拖动比例小部件时,程序提示错误:
TypeError: <lambda>() takes 0 positional arguments but 1 was given.
代码如下所示。请告诉我如何通过直接拖动缩放小部件来控制文本大小。
##### Imports #####
from tkinter import *
from tkinter import ttk
###################################################################
# FUNCTIONS #
###################################################################
def slide(mainCanvas, textSlider):
slide.textLayer.place_forget()
slide.textLayer = Label(mainCanvas, text="TEST", font=('Arial', int(textSlider.get())), bg='white', fg='red')
slide.textLayer.place(relx=0.5, rely=0.5, anchor='center')
###################################################################
# MAIN #
###################################################################
def main():
root = Tk()
rootWidth = 500
rootHeight = 510
root.minsize(rootWidth, rootHeight)
mainFrameCanvas = Frame(root, bg='white', width=rootWidth, height=350)
mainFrameCanvas.pack(anchor='n')
mainCanvas = Canvas(mainFrameCanvas, width=rootWidth, height=350, bg='white', relief='solid', borderwidth=1)
mainCanvas.pack(fill='x', expand=1)
mainFrameSlider = Frame(root, bg='white', width=rootWidth, height=150, relief='solid', borderwidth=1)
mainFrameSlider.pack(anchor='s')
slide.textLayer = Label(mainCanvas, text="TEST", bg='white', fg='red')
slide.textLayer.place(relx=0.5, rely=0.5, anchor='center')
var = DoubleVar()
textSlider = Scale(mainFrameSlider, from_=10, to=30, variable=var, orient=HORIZONTAL, length=rootWidth*0.9, troughcolor='white', showvalue=1, bg='white', highlightbackground='white')
textSlider.bind("<Button-1>", lambda: slide(mainCanvas, textSlider))
textSlider.place(x=20, y=40)
my_btn = Button(root, text="Click Me!", command=lambda: slide(mainCanvas, textSlider)).pack()
root.mainloop()
###################################################################
# RUN #
###################################################################
def run():
print('\nStart script')
main()
print('Finished script')
run()
事件绑定的回调需要一个参数,Event
对象。所以
textSlider.bind("<Button-1>", lambda: slide(mainCanvas, textSlider))
应改为:
textSlider.bind("<Button-1>", lambda e: slide(mainCanvas, textSlider))
请注意,您无需删除并重新创建 slide()
中的标签,只需更新标签的字体即可:
def slide(mainCanvas, textSlider):
slide.textLayer.config(font=('Arial', int(textSlider.get())))
我正在尝试使用 tkinter 缩放小部件来增加或减小 canvas 上的标签小部件文本大小。我正在使用比例小部件变量值来这样做。单击按钮时文本大小会发生变化(my_btn),但我希望它发生变化,我想通过向左或向右拖动比例小部件来增加或减小文本大小。当我拖动比例小部件时,程序提示错误:
TypeError: <lambda>() takes 0 positional arguments but 1 was given.
代码如下所示。请告诉我如何通过直接拖动缩放小部件来控制文本大小。
##### Imports #####
from tkinter import *
from tkinter import ttk
###################################################################
# FUNCTIONS #
###################################################################
def slide(mainCanvas, textSlider):
slide.textLayer.place_forget()
slide.textLayer = Label(mainCanvas, text="TEST", font=('Arial', int(textSlider.get())), bg='white', fg='red')
slide.textLayer.place(relx=0.5, rely=0.5, anchor='center')
###################################################################
# MAIN #
###################################################################
def main():
root = Tk()
rootWidth = 500
rootHeight = 510
root.minsize(rootWidth, rootHeight)
mainFrameCanvas = Frame(root, bg='white', width=rootWidth, height=350)
mainFrameCanvas.pack(anchor='n')
mainCanvas = Canvas(mainFrameCanvas, width=rootWidth, height=350, bg='white', relief='solid', borderwidth=1)
mainCanvas.pack(fill='x', expand=1)
mainFrameSlider = Frame(root, bg='white', width=rootWidth, height=150, relief='solid', borderwidth=1)
mainFrameSlider.pack(anchor='s')
slide.textLayer = Label(mainCanvas, text="TEST", bg='white', fg='red')
slide.textLayer.place(relx=0.5, rely=0.5, anchor='center')
var = DoubleVar()
textSlider = Scale(mainFrameSlider, from_=10, to=30, variable=var, orient=HORIZONTAL, length=rootWidth*0.9, troughcolor='white', showvalue=1, bg='white', highlightbackground='white')
textSlider.bind("<Button-1>", lambda: slide(mainCanvas, textSlider))
textSlider.place(x=20, y=40)
my_btn = Button(root, text="Click Me!", command=lambda: slide(mainCanvas, textSlider)).pack()
root.mainloop()
###################################################################
# RUN #
###################################################################
def run():
print('\nStart script')
main()
print('Finished script')
run()
事件绑定的回调需要一个参数,Event
对象。所以
textSlider.bind("<Button-1>", lambda: slide(mainCanvas, textSlider))
应改为:
textSlider.bind("<Button-1>", lambda e: slide(mainCanvas, textSlider))
请注意,您无需删除并重新创建 slide()
中的标签,只需更新标签的字体即可:
def slide(mainCanvas, textSlider):
slide.textLayer.config(font=('Arial', int(textSlider.get())))