簡體   English   中英

如何調用 function 並在 tkinter 比例小部件中傳遞變量?

[英]How to call a function and pass variable in tkinter scale widget?

我正在嘗試使用 tkinter 比例小部件來增加或減少 canvas 上的 Label 小部件文本大小。我正在使用比例小部件變量值來執行此操作。 單擊按鈕 (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 object。所以

textSlider.bind("<Button-1>", lambda: slide(mainCanvas, textSlider))

應該改為:

textSlider.bind("<Button-1>", lambda e: slide(mainCanvas, textSlider))

請注意,您無需在slide()中刪除並重新創建 label,只需更新 label 的字體即可:

def slide(mainCanvas, textSlider):
    slide.textLayer.config(font=('Arial', int(textSlider.get())))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM