简体   繁体   English

Tkinter按钮绑定问题

[英]Tkinter button bind issues

My goal is to eventually have a few labels and entries that appear and correspond with the different days of the week. 我的目标是最终使一些标签和条目出现并与一周中的不同日子相对应。 I am currently working on getting the button binding to generate a different label depending on which day of the week is selected. 我目前正在努力使按钮绑定生成一个不同的标签,具体取决于选择的是星期几。 It's sort of working, but not how I expected and not how I really want. 这有点工作,但不是我的预期,也不是我真正想要的。 Right now I have to click on a button twice for it to update the label. 现在,我必须单击两次按钮才能更新标签。 I'm still pretty new to programming and I appreciate any help you can provide! 我对编程还是很陌生,感谢您提供的任何帮助!

root = Tk()
root.geometry('300x300')
root.title('Day')

frame3 = Frame(root)
frame4 = Frame(root)
frame3.grid()

dayFrame = Frame(frame4)
class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.var1 = StringVar()
        self.var1.set('')
        self.sunBtn = Button(frame3, text='Sunday', command=lambda day='Sunday': self.var1.set(day))
        self.sunBtn.bind('<Button-1>', self.openFrame)
        self.sunBtn.grid(row=1, column=0)
        self.monBtn = Button(frame3, text='Monday', command=lambda day='Monday': self.var1.set(day))
        self.monBtn.bind('<Button-1>', self.openFrame)
        self.monBtn.grid(row=1, column=1)

    def openFrame(self,*args):
        frame4.grid()
        dayFrame.grid()
        dayLbl = Label(dayFrame, text=self.var1.get())
        dayLbl.grid(row=1, column=0)

app = App(root)
app.mainloop()

UPDATE: I realized my mistake. 更新:我意识到我的错误。 I feel dumb. 我觉得很蠢 I replaced 我更换了

self.var1.set('')

with

self.var1.trace('w', self.openFrame)

and it seems like everything is working properly. 似乎一切正常。 Hopefully this can help another beginner at some point! 希望这可以在某种程度上帮助另一个初学者!

Don't use bind and command at the same time: (and don't forget to write your import line) 不要同时使用bind和command:(并且不要忘记编写导入行)

from tkinter import *

root = Tk()
root.geometry('300x300')
root.title('Day')

frame3 = Frame(root)
frame4 = Frame(root)
frame3.grid()

dayFrame = Frame(frame4)
class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.var1 = StringVar()
        self.var1.set('')
        self.sunBtn = Button(frame3, text='Sunday', command= lambda: self.openFrame('Sunday'))
        self.sunBtn.grid(row=1, column=0)
        self.monBtn = Button(frame3, text='Monday', command=lambda: self.openFrame('Monday'))
        self.monBtn.grid(row=1, column=1)

    def openFrame(self, day):
        frame4.grid()
        dayFrame.grid()
        dayLbl = Label(dayFrame, text=day)
        dayLbl.grid(row=1, column=0)

app = App(root)
app.mainloop()

A very different (and probably better) solution: 一个非常不同(可能更好)的解决方案:

from tkinter import *
import calendar

root = Tk()
root.geometry('600x300')
root.title('Day')

frame3 = Frame(root)
frame4 = Frame(root)
frame3.grid()

dayFrame = Frame(frame4)
class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)        
        frame4.grid()
        dayFrame.grid()
        self.dayLbl = Label(dayFrame, text="")
        self.dayLbl.grid(row=1, column=0)
        for i,  day in enumerate(calendar.day_name):
            button = Button(frame3, text=day, command= lambda day=day:\
                self.dayLbl.configure(text=day))
            button.grid(row=1, column=i)         

app = App(root)
app.mainloop()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM