через некоторое время окно tkinter зависает - PullRequest
0 голосов
/ 24 сентября 2019

Я новичок в Tkinter.Я экспериментировал с этим, но хотя Tkinter запускается просто отлично, через некоторое время он иногда зависает без всякой причины.На самом деле, странная вещь, которая случается, состоит в том, что, хотя окна Tkinter больше не обновляют информацию, счетчик продолжает печатать НА МОЙ WINDOWS DESKTOP ЛЕВАЯ СТОРОНА!(просто черная коробка bg с белым шрифтом, которая показывает номер счетчика) и в конечном итоге находит номер 777 и заканчивается.Но между ними долго зависает, даже без печати (не на моем рабочем столе Windows)

это обычное окно tkinter это вывод на консоль все хорошо здесь

сумасшедшее отображение Windows здесь

Простая программа здесь генерирует случайные числа от 1 до 10000 и должна 1), если найдено 777, она должна напечатать счетчик и выйти 2) если найдено какое-либо число от 1 до 100, должно быть напечатано число и счетчик.

Я пытаюсь научиться печатать новый контент в той же строке, и если что-то происходит, выведите дополнительную информацию в другой строке.пока первое (или более) продолжает обновляться.

Я не уверен, правильно ли я выхожу из программы или как именно мне следует использовать / вызывать функцию Tkinter для обновления информации на экране.

Любая помощь или советы наиболее ценные.

from tkinter import *
import random
import time

tk=Tk()
i = 0
counter = 0

tk.title("Testing...")
tk.geometry('300x200')

canvas_width = 200
canvas_height = 100
canvas = Canvas(tk, width=canvas_width, height=canvas_height, bg='white')
canvas.pack(expand=YES)

def screen(Found):
    #canvas.create_text(20, 20, text="Counter:" + str(counter), font="Times 20 italic")
    widget = Label(canvas, text="Counter:" + str(counter), fg='white', bg='black')
    widget.grid(column=0, row=0)
    if Found:
        widget = Label(canvas, text="Number " + str(i) +" was found at counter:" + str(counter), fg='white', bg='black')
        widget.grid(column=0, row=1)

found = False

loop = True
while loop:
    counter += 1
    i = random.randint(1, 10000)

    if i in range(1, 100):
        print("Found i = ", i, " in counter:", counter)
        Found = True
    else:
        Found = False

    if i == 777:
        loop = False
        print("JUST FOUND 777")
        print("Counter:", counter)

    screen(Found)
    tk.update_idletasks()
    tk.update()

# tk.mainloop()

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Что касается дизайна, обычно лучше использовать основную шину tkinter для управления приложением.root.after является отличной заменой циклу while.Метки не должны быть воссозданы;они могут использовать специальные переменные, которые сами обновляют отображаемые значения, а их свойства могут быть перенастроены.Вызов update и update_idletasks вряд ли когда-либо понадобится.

Возможно, следующий подход является более подходящим, когда одна отдельная метка обновляется из цикла, питаемого главным циклом tkinter:
(он показывает вам "как продолжать показывать новые вещи без проблем с ярлыками" )

import tkinter as tk
import random

def screen(found, v, c):
    if found:
        label.configure(bg='red', fg='blue')
        print('found')
    else:
        label.configure(bg='black', fg='white')
    update_lbl_txt(v, c)

def update_lbl_txt(v=0, c=0):
    txt = f'Number at {v} was found at counter {c}'
    lbl_txt.set(txt)

def found_target(t):
    return t in range(1, 100) or t == 777

def loop(c=0):
    v = random.randint(1, 10000)
    screen(found_target(v), v, c)
    root.after(100, loop, c+1)

root = tk.Tk()

root.title("Testing...")
root.geometry('300x200')

lbl_txt = tk.StringVar(root)
update_lbl_txt()
label = tk.Label(root, textvariable=lbl_txt, fg='white', bg='black')
label.pack(expand=True, fill=tk.BOTH)

loop()

root.mainloop()
0 голосов
/ 24 сентября 2019

Причина, по которой кажется, что она замораживается, хотя бы частично, потому что у вас бесконечный цикл, из которого вы никогда не выходите из строя.Большую часть времени i не будет находиться в диапазоне от 1 до 100, а также не будет 777, но ваш цикл будет продолжать работать и никогда не обновлять экран.

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

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