簡體   English   中英

相同的 function 但不同的框架

[英]Same function but different frames

我正在嘗試制作一個迷你定時器程序,但是我有一個問題:每個幀都使用相同的 function,稱為 setTimer,那么我應該在 setTimer function 中引用什么幀? 這是我的代碼:

def createFrames(self): 
        self.timer1_frame = Frame(root, width=300, height=300, background="red")
        self.timer1_frame.grid_propagate(0)
        self.timer1_frame.grid(row=0, column=0)
        
        self.timer2_frame = Frame(root, width=300, height=300, background="blue")
        self.timer2_frame.grid_propagate(0)
        self.timer2_frame.grid(row=0, column=1)

        self.timer3_frame = Frame(root, width=300, height=300, background="orange")
        self.timer3_frame.grid_propagate(0)
        self.timer3_frame.grid(row=1, column=0)
        
        self.timer4_frame = Frame(root, width=300, height=300, background="yellow")
        self.timer4_frame.grid_propagate(0)
        self.timer4_frame.grid(row=1, column=1)

    def createWidgets(self):   
        self.setTimer1_button = Button(self.timer1_frame, text="SET TIMER", command=self.setTimer)
        self.setTimer1_button.grid(row=0, column=0, padx=30, pady=20)
        
        self.setTimer2_button = Button(self.timer2_frame, text="SET TIMER", command=self.setTimer)
        self.setTimer2_button.grid(row=0, column=1, padx=30, pady=20)

        self.setTimer3_button = Button(self.timer3_frame, text="SET TIMER", command=self.setTimer)
        self.setTimer3_button.grid(row=1, column=0, padx=30, pady=20)

        self.setTimer4_button = Button(self.timer4_frame, text="SET TIMER", command=self.setTimer)
        self.setTimer4_button.grid(row=1, column=1, padx=30, pady=20)

    def setTimer(self):
        
        self.hoursLabel = Label(root, text="Hours: ")
        self.minutesLabel = Label(root, text="Minutes: ")
        self.secondsLabel = Label(root, text="Seconds: ")

如您所見,我在我的 setTimer function 中引用了 root 但我認為它不正確,我會放什么來代替它知道我指的是哪個框架,而不必寫 4 很多相同的代碼(這可能嗎?)

您可以使用Label中使用的參數frame創建方法

def setTimer(self, frame):
    self.hoursLabel = Label(frame, text="Hours: ")
    # ... rest ...

然后你可以在command=中使用lambda來分配 function 和參數

self.setTimer1_button = tk.Button..., command=lambda:self.setTimer(self.timer1_frame))

它有效。

但它有一個問題:在所有幀中,它都將標簽分配給相同的變量self.hoursLabel等,因此您無法訪問標簽來更改文本(即更新時間)。 您必須使用分隔變量,但需要將它們保存在列表或字典中並使用frame作為鍵。

import tkinter as tk

class Window():

    def __init__(self):
        # dictionary for labels
        self.labels = {}
        
        self.createFrames()
        self.createWidgets()
        
    def createFrames(self): 
        self.timer1_frame = tk.Frame(root, width=300, height=300, background="red")
        self.timer1_frame.grid_propagate(0)
        self.timer1_frame.grid(row=0, column=0)
        
        self.timer2_frame = tk.Frame(root, width=300, height=300, background="blue")
        self.timer2_frame.grid_propagate(0)
        self.timer2_frame.grid(row=0, column=1)

        self.timer3_frame = tk.Frame(root, width=300, height=300, background="orange")
        self.timer3_frame.grid_propagate(0)
        self.timer3_frame.grid(row=1, column=0)
        
        self.timer4_frame = tk.Frame(root, width=300, height=300, background="yellow")
        self.timer4_frame.grid_propagate(0)
        self.timer4_frame.grid(row=1, column=1)

    def createWidgets(self):   
        self.setTimer1_button = tk.Button(self.timer1_frame, text="SET TIMER", command=lambda:self.setTimer(self.timer1_frame))
        self.setTimer1_button.grid(row=0, column=0, padx=30, pady=20)
        
        self.setTimer2_button = tk.Button(self.timer2_frame, text="SET TIMER", command=lambda:self.setTimer(self.timer2_frame))
        self.setTimer2_button.grid(row=0, column=0, padx=30, pady=20)

        self.setTimer3_button = tk.Button(self.timer3_frame, text="SET TIMER", command=lambda:self.setTimer(self.timer3_frame))
        self.setTimer3_button.grid(row=0, column=0, padx=30, pady=20)

        self.setTimer4_button = tk.Button(self.timer4_frame, text="SET TIMER", command=lambda:self.setTimer(self.timer4_frame))
        self.setTimer4_button.grid(row=0, column=0, padx=30, pady=20)

    def setTimer(self, frame):
        self.hoursLabel   = tk.Label(frame, text="Hours: ")
        self.minutesLabel = tk.Label(frame, text="Minutes: ")
        self.secondsLabel = tk.Label(frame, text="Seconds: ")

        self.hoursLabel.grid(row=1)
        self.minutesLabel.grid(row=2)
        self.secondsLabel.grid(row=3)

        # remember labels in dictionary
        self.labels[frame] = [self.hoursLabel, self.minutesLabel, self.secondsLabel]
        
        # start update time
        self.updateTimer(frame, 0)
                    
    def updateTimer(self, frame, seconds):
        
        secondsLabel = self.labels[frame][2]
        secondsLabel['text'] = "Seconds: {}".format(seconds)
        seconds += 1
        root.after(1000, self.updateTimer, frame, seconds)
        
root = tk.Tk()
Window()
root.mainloop()

編輯:

使用Frame創建自己的小部件會更簡單,其中包含一個Frame 、一個Button 、計時器所需的所有Labels和變量。 然后在主 window 中使用此小部件 4 次。

import tkinter as tk

class MyTimer(tk.Frame):
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.hours = 0
        self.minutes = 0
        self.seconds = 0
        
        self.button = tk.Button(self, text="SET TIMER", command=self.set_timer)
        self.button.grid(row=0, column=0, padx=30, pady=20)

        self.hours_label   = None
        self.minutes_label = None
        self.seconds_label = None

    def set_timer(self):
        if self.hours_label is None:
            self.hours_label   = tk.Label(self, text="Hours: ")
            self.minutes_label = tk.Label(self, text="Minutes: ")
            self.seconds_label = tk.Label(self, text="Seconds: ")

            self.hours_label.grid(row=1)
            self.minutes_label.grid(row=2)
            self.seconds_label.grid(row=3)

        # reset time
        self.hours = 0
        self.minutes = 0
        self.seconds = 0
        
        # start updating time
        self.update_timer()
        
    def update_timer(self):
        self.hours_label['text']   = "Hours: {}".format(self.hours)
        self.minutes_label['text'] = "Minutes: {}".format(self.minutes)
        self.seconds_label['text'] = "Seconds: {}".format(self.seconds)
        self.seconds += 1

        if self.seconds == 60:
            self.seconds = 0
            self.minutes += 1

        if self.minutes == 60:
            self.minutes = 0
            self.hours += 1
            
        # update again after 1000ms (1s)
        root.after(1000, self.update_timer)
        
class Window():

    def __init__(self):
        self.createFrames()
        
    def createFrames(self): 
        self.timer1_frame = MyTimer(root, width=300, height=300, background="red")
        self.timer1_frame.grid_propagate(0)
        self.timer1_frame.grid(row=0, column=0)
        
        self.timer2_frame = MyTimer(root, width=300, height=300, background="blue")
        self.timer2_frame.grid_propagate(0)
        self.timer2_frame.grid(row=0, column=1)

        self.timer3_frame = MyTimer(root, width=300, height=300, background="orange")
        self.timer3_frame.grid_propagate(0)
        self.timer3_frame.grid(row=1, column=0)
        
        self.timer4_frame = MyTimer(root, width=300, height=300, background="yellow")
        self.timer4_frame.grid_propagate(0)
        self.timer4_frame.grid(row=1, column=1)
        
root = tk.Tk()
Window()
root.mainloop()

暫無
暫無

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

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