Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 11, 2016 18:16:12

python335
Зарегистрирован: 2016-10-19
Сообщения: 88
Репутация: +  -8  -
Профиль   Отправить e-mail  

Проблема с циклом

Я хочу сделать с помощью tkinter так, чтобы при нажатии на кнопку в Label добавлялось одно ‘X’ кажд1ю секунду.
Вот как сделал:

 from tkinter import *
import time
root = Tk()
def cicle():
      global texter, oper
      for c in range(0, 10):
            texter = texter + 'X'
            oper["text"] = texter
            oper.pack(side='top', fill='x')
            time.sleep(1)
texter = 'X'
oper = Label(root, text=texter, width=3, height=1)
oper.pack(side='top', fill='x')
start = Button(root, text='Start', command=cicle)
start.pack(side='bottom', fill='x')
root.mainloop()
Но при попытке нажатия на кнопку - программа зависает и отвисает только по окончаню цикла, и появляется сразу 11-12 иксов. Как это можно исправить?

Отредактировано python335 (Дек. 11, 2016 18:17:05)

Офлайн

#2 Дек. 12, 2016 09:40:25

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Проблема с циклом

честно говоря в ТК не силен, но как я понимаю тут дело не в цикле а в принципе работы Button-а(или mainloop ткинтера), вы не увидите результата нажатия пока процедура не отработает полностью и не вернет какойнибудь “финишед”… первое что приходит в голову это использовать threading

 from tkinter import *
import time
import threading
root = Tk()
def run():
    t1 = threading.Thread(target=cicle)
    t1.start()
def cicle():
      global texter, oper
      for c in range(0, 10):
            texter = texter + 'X'
            oper["text"] = texter
            #oper.pack(side='top', fill='x')
            time.sleep(1)
texter = 'X'
oper = Label(root, text=texter, width=3, height=1)
oper.pack(side='top', fill='x')
start = Button(root, text='Start', command=run)
start.pack(side='bottom', fill='x')
root.mainloop()
ХЗ может ктото предложит более элегантное решение без многопоточности..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 12, 2016 09:42:06)

Офлайн

#3 Дек. 13, 2016 13:06:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Проблема с циклом

я лошара, все гораздо проще, ну и + я таки совсем плохо знаю ткинтер. код без многопоточности:

 from tkinter import *
import time
root = Tk()
def cicle():
      global texter, oper
      for c in range(0, 10):
            texter = texter + 'X'
            oper["text"] = texter
            #oper.pack(side='top', fill='x')
            oper.update()
            time.sleep(1)
texter = 'X'
oper = Label(root, text=texter, width=3, height=1)
oper.pack(side='top', fill='x')
start = Button(root, text='Start', command=cicle)
start.pack(side='bottom', fill='x')
root.mainloop()



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Дек. 13, 2016 13:07:26)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version