Окно Tkinter не открывается при импорте времени - PullRequest
0 голосов
/ 29 мая 2018

Я использую простую программу для часов, которую я сделал, и во время редактирования у меня возникла проблема.Часы работали сами по себе с оператором print, а окно tinter также работало само по себе, но вместе это не работает.Я заново создал его, импортировав библиотеку tkinter, а затем добавил время импорта, и я перестал работать.Что я могу сделать?Вот мой код(Я использую Python v3.6.5) `

import time
from tkinter import*
hours = int(input("what hour is it?"))
minutes = int(input("what minute is it?"))
seconds = int(input("what second is it?"))
window = Tk()
texthours = Text(window, width=1, height=1)
textminutes = Text(window, width=1, height=1)
textseconds = Text(window, width=1, height=1)
textseconds.pack()
textminutes.pack()
texthours.pack()
while 1==2-1:
    time.sleep(1)
    texthours.delete(0.0, END)
    textminutes.delete(0.0, END)
    textseconds.delete(0.0, END)
    texthours.insert(END, hours)
    textminutes.insert(END, minutes)
    textseconds.insert(END, seconds)
    seconds = seconds + 1
    if seconds == 60:
        minutes = minutes + 1
        seconds = 0
    if minutes == 60:
        hours = hours + 1
        minutes = 0
    if hours == 24:
        hours = 0

`

1 Ответ

0 голосов
/ 29 мая 2018

Программа с графическим интерфейсом обычно использует управляемую событиями модель исполнения.Это означает, что вы создаете графический интерфейс, и он находится в цикле, ожидая событий, на которые он реагирует.Но в вашей программе есть бесконечный цикл while, поэтому графический интерфейс не имеет возможности что-либо делать.

Есть более эффективные способы сделать это, но вот исправленная версия вашего кода с минимальными изменениями.

Не рекомендуется использовать time.sleep в программе с графическим интерфейсом, потому что это переводит все в спящий режим, поэтому графический интерфейс не может реагировать на события.В Tkinter вы можете периодически вызывать функцию, используя метод .after.

import tkinter as tk

hours = int(input("what hour is it? "))
minutes = int(input("what minute is it? "))
seconds = int(input("what second is it? "))

window = tk.Tk()

texthours = tk.Text(window, width=2, height=1)
textminutes = tk.Text(window, width=2, height=1)
textseconds = tk.Text(window, width=2, height=1)

texthours.pack(side=tk.LEFT)
textminutes.pack(side=tk.LEFT)
textseconds.pack(side=tk.LEFT)

def show_time():
    global hours, minutes, seconds

    texthours.delete(0.0, tk.END)
    textminutes.delete(0.0, tk.END)
    textseconds.delete(0.0, tk.END)
    texthours.insert(tk.END, hours)
    textminutes.insert(tk.END, minutes)
    textseconds.insert(tk.END, seconds)
    seconds = seconds + 1
    if seconds == 60:
        minutes = minutes + 1
        seconds = 0
    if minutes == 60:
        hours = hours + 1
        minutes = 0
    if hours == 24:
        hours = 0
    window.after(1000, show_time)

window.after(1000, show_time)
window.mainloop()

Вот немного лучшая версия, которая объединяет все в класс, поэтому нам не нужно использоватьglobal.Это требует немного большего набора текста, но делает его более управляемым, особенно в больших сложных графических интерфейсах.

import tkinter as tk

class Clock:
    def __init__(self):
        self.hours = int(input("what hour is it? "))
        self.minutes = int(input("what minute is it? "))
        self.seconds = int(input("what second is it? "))

        self.window = tk.Tk()

        self.texthours = tk.Text(self.window, width=2, height=1)
        self.textminutes = tk.Text(self.window, width=2, height=1)
        self.textseconds = tk.Text(self.window, width=2, height=1)

        self.texthours.pack(side=tk.LEFT)
        self.textminutes.pack(side=tk.LEFT)
        self.textseconds.pack(side=tk.LEFT)

        self.window.after(1000, self.show_time)
        self.window.mainloop()

    def show_time(self):
        self.texthours.delete(0.0, tk.END)
        self.textminutes.delete(0.0, tk.END)
        self.textseconds.delete(0.0, tk.END)
        self.texthours.insert(tk.END, self.hours)
        self.textminutes.insert(tk.END, self.minutes)
        self.textseconds.insert(tk.END, self.seconds)
        self.seconds += 1
        if self.seconds == 60:
            self.minutes += 1
            self.seconds = 0
        if self.minutes == 60:
            self.hours += 1
            self.minutes = 0
        if self.hours == 24:
            self.hours = 0
        self.window.after(1000, self.show_time)

Clock()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...