Python3, Tkinter и запрос пользовательского ввода на время

Я действительно добился некоторого прогресса в основных понятиях и формулировках в Python, но я немного теряюсь, когда мы начинаем добавлять в смесь Tkinter. BryanOakley внес большой вклад в вопрос о множественных окнах и 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()

person RL_NooB    schedule 23.05.2017    source источник


Ответы (1)


Честно говоря, я думаю, что концепция переключения кадров — плохой выбор для тех, кто учится использовать tkinter. Этот пример никогда не предназначался для использования в качестве отправной точки для начинающих, особенно для таких простых вещей, как будильник. Это добавляет много накладных расходов с очень небольшой выгодой.

Я рекомендую начать заново с одного окна. Добавьте виджеты для ввода часов и минут, метку для отображения часов и кнопку для запуска часов. Это все, что вам нужно для этого упражнения. Вероятно, это будет пара десятков строк кода.

Ваш метод tick, вероятно, можно использовать более или менее как есть, хотя я не вижу смысла обновлять часы пять раз в секунду, если вы показываете время только до целых секунд.

Только после того, как вы получите эту работу, вы можете начать пытаться работать с продвинутыми архитектурами, такими как код «переключения кадров».

person Bryan Oakley    schedule 23.05.2017
comment
Спасибо за помощь! - person RL_NooB; 25.05.2017
comment
Итак, я пробую ваше предложение, но я просто зависаю, когда добавляю несколько методов в класс. Кажется, я могу определить класс, заставить часы работать, но когда я пытаюсь добавить кнопку для будильника, я получаю ошибки атрибутов или ошибки, указывающие на то, что переменные вызываются до того, как они определены. Есть ли хитрость в порядке методов внутри класса при использовании Tkinter? - person RL_NooB; 25.05.2017
comment
@RL_NooB: нет никаких приемов, кроме стандартных методов программирования: определяйте вещи перед их использованием, сохраняйте ссылки на вещи, которые вам нужны, в нескольких местах и ​​т. д. - person Bryan Oakley; 26.05.2017
comment
Я продолжу. Я думаю, что начал с большего, чем я могу проглотить, но я многому учусь, борясь здесь. Спасибо еще раз. - person RL_NooB; 26.05.2017