2017-05-23 37 views
0

我真的在Python的基本概念和語言方面取得了一些進展,但是當我們開始將Tkinter添加到混合中時,我有點迷失方向。 BryanOakley在網絡上隨處可見的關於多個窗口和Tkinter的問題做出了巨大貢獻。我舉了他的例子,並將其與我見過的其他一些例子結合起來,並開始製作鬧鐘,並在警報時間開始時改變時鐘背景。問題是,我無法看到樹木通過林並沒有看到如何:Python3,Tkinter和用戶輸入時間請求

A)獲取輸入請求從Tkinter的窗口出現
B)呼叫用戶的報警類別輸入到時鐘類觸發窗口的背景變化。

我覺得我的問題是我不完全理解在哪裏嵌套不同的方法,以及如何獲取存儲用戶數據的變量,並將其從字符串格式化爲時間。我想我只是需要一些指導,但是如果你認爲我已經過了頭,那麼請將我指向淺端,這樣我就可以繼續練習。這是我的想法,把它或類似的東西放到tick()方法中,當然我不得不想知道哪些輸入甚至會被輸入到Tkinter中。我正在螺旋上升。說明:

def wake(self): 
    self.__init__(self, hour, min) 
    self.hour = hour 
    self.min = min 
     input("what is the hour?", 
     input("What is the min?", 
    hour = datetime.datetime.now().strftime("%I") 
    min = datetime.datetime.now().strftime("%M") 
    if self.hour and self.min == time1(): 
     label.config(text = time1, bg = "green") 
    else: 
     label.config(text = time1, bg = "red") 

這是我到目前爲止有:

import tkinter as tk 
from tkinter import font as tkfont 
from tkinter import messagebox 
import time 
import datetime 


class digitalClockApp(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     self.title_font = tkfont.Font(family='Helvetica', size=100, weight="bold", slant="italic") 

     container = tk.Frame(self) 
     container.pack(side = "top", fill= "both", expand =1) 
     container.grid_rowconfigure(0,weight = 1) 
     container.grid_columnconfigure(0, weight = 1) 

     self.frames = {} 
     for F in (introPage, clock, alarm): 
      page_name = F.__name__ 
      frame = F(parent = container, controller = self) 
      self.frames[page_name] = frame 

      frame.grid(row = 0, column = 0, sticky = "nsew") 
      self.geometry("640x480") 

     self.show_frame("introPage") 

    def show_frame(self, page_name): 
     frame = self.frames[page_name] 
     frame.tkraise() 


class introPage(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text = "Welcome", bg = "black", fg = "white", font = controller.title_font) 
     label.pack(side = "top", fill = "both", expand = 1) 

     button1 = tk.Button(self, text = "Go to Clock", command = lambda: controller.show_frame("clock")) 
     button2 = tk.Button(self, text = "Go to Set Alarm", command = lambda: controller.show_frame("alarm")) 
     button1.pack(side = "left") 
     button2.pack(side = "left") 

class clock(tk.Frame): 
    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text = "", bg = "black", fg = "white", font = controller.title_font) 
     label.pack(side = "top", fill = "both", expand = 1) 
     button = tk.Button(self, text = "Home Screen", command = lambda: controller.show_frame("introPage")) 
     button.pack() 

     def tick(time1 = ""): 
      time2 = time.strftime("%I:%M:%S") 
      if time2 != time1: 
       time1 = time2 
       label.config(text = time1, bg = "red") 
      label.after(200, tick) 

     tick() 

class alarm(tk.Frame): 

    def __init__(self, parent, controller): 
     tk.Frame.__init__(self, parent) 
     self.controller = controller 
     label = tk.Label(self, text = "", bg = "black", fg = "white", font = controller.title_font) 
     label.pack(side = "top", fill = "both", expand = 1) 
     def wake(): 
     button = tk.Button(self, text = "Home Screen", command = lambda: controller.show_frame("introPage")) 
     button.pack() 



if __name__ == "__main__": 
    app = digitalClockApp() 
    app.mainloop() 

回答

0

坦率地說,我想切換幀的概念是一個人學習使用Tkinter的一個不錯的選擇。這個例子從來沒有被用作初學者的起點,特別是像鬧鐘那樣簡單。它增加了很多開銷,但沒有多少好處。

我的建議是重新開始一個窗口。添加小時和分鐘的條目小部件,顯示時鐘的標籤以及啓動時鐘的按鈕。這就是您練習所需的一切。這可能是幾十行代碼。

您的tick方法可能或多或少地按照原樣使用,但如果您只顯示整秒的時間,我沒有看到每秒鐘更新時鐘五次的要點。

只有當你得到那個工作後,你才應該開始嘗試使用像「切換幀」代碼這樣的高級體系結構。

+0

謝謝你的幫助! –

+0

所以,我正在嘗試你的建議,但是一旦我將多個方法添加到一個類中,我就會掛斷電話。看起來我可以定義類,讓時鐘運行,但第二次我嘗試添加一個按鈕的警報,我結束了屬性錯誤,或錯誤指示變量被定義之前被調用。使用Tkinter時,類中的方法的順序有竅門嗎? –

+0

@RL_NooB:除了標準編程實踐之外,沒有其他技巧:在使用它們之前定義事物,在多個地方保存對所需事物的引用等。 –