Форум сайта python.su
ДД. Есть код с бесконечным циклом, пробую на кнопку повесить завершение, не закрывается прога, подскажите, что я не так делаю. Пробовал exit(0), в функцию залетает, но все продолжает работать.
from tkinter import * import random import sys import time tk = Tk() canvas = Canvas(tk, width=800, height=800) canvas.pack() x1 = 10; y1 = 10; x2 = 10; y2 = 60; x3 = 50; y3 = 35 def random_color(): color_code = [] for i in range(3): color_code.append(random.randrange(255)) color = '#%s%s%s' %('%02x' % color_code[0], '%02x' % color_code[1], '%02x' % color_code[2]) return(color) for e in range(13): if e > 0: x1 += 60; x2 += 60; x3 += 60 y1 = 10; y2 = 60; y3 = 35 for x in range(13): canvas.create_polygon(x1, y1, x2, y2, x3, y3, fill = random_color()) y1 += 60; y2 += 60; y3 += 60 def mainloop(): while True: val = 5 whoMoving = [] for i in range (val): whoMoving.append(random.randint(1, 169)) for a in range(val): canvas.move(whoMoving[a], 10, 10) canvas.itemconfigure(random.randint(1, 169), fill = random_color()) tk.update() time.sleep(0.1) for a in range(val): canvas.move(whoMoving[a], -10, -10) tk.update() time.sleep(0.1) def kill(a): raise SystemExit sys.exit(0) canvas.bind_all('<KeyPress-Up>', kill) mainloop()
Офлайн
Я не спец по TK, но mainloop должен быть самого TK, в котором он обрабатывает события. Вот пример. Я думаю что у Вас ничего не происходит потому что обработка нажатия клавиш не происходит. Потому что в целом Вы не правильно пользуетесь TK.
Офлайн
JOHN_16Как ни странно но происходит, хотя конечно такая реализация mainloop является тем еще колхозом.
Я думаю что у Вас ничего не происходит потому что обработка нажатия клавиш не происходит. Потому что в целом Вы не правильно пользуетесь TK.
Brainнеправильно делаете mainloop, лучше использовать стандартный функционал tk.mainloop() и метод after() чтобы вызывать периодически некую функцию .
Есть код с бесконечным циклом, пробую на кнопку повесить завершение, не закрывается прога, подскажите, что я не так делаю.
.... tk = Tk() tk.ml = True ... def mainloop(): while tk.ml == True: ..... def kill(a): tk.ml = False tk.quit() tk.destroy() .....
[code python][/code]
Отредактировано PEHDOM (Май 5, 2018 15:45:17)
Офлайн
PEHDOM
PEHDOM
неправильно делаете mainloop
from tkinter import * import random tk = Tk() canvas = Canvas(tk, width=800, height=800) canvas.pack() x1 = 10; y1 = 10; x2 = 10; y2 = 60; x3 = 50; y3 = 35 counter = 0 whoMoving = [] def random_color(): color_code = [] for i in range(3): color_code.append(random.randrange(255)) color = '#%s%s%s' %('%02x' % color_code[0], '%02x' % color_code[1], '%02x' % color_code[2]) return(color) for e in range(13): if e > 0: x1 += 60; x2 += 60; x3 += 60 y1 = 10; y2 = 60; y3 = 35 for x in range(13): canvas.create_polygon(x1, y1, x2, y2, x3, y3, fill = random_color()) y1 += 60; y2 += 60; y3 += 60 def movingNumbers(val): whoMoving = [] for i in range(val): whoMoving.append(random.randint(1, 169)) return whoMoving def main(): global counter global whoMoving if counter == 0: whoMoving = movingNumbers(5) counter += 1 for a in range(len(whoMoving)): canvas.move(whoMoving[a], 10, 10) else: counter -= 1 for a in range(len(whoMoving)): canvas.move(whoMoving[a], -10, -10) for i in range(len(whoMoving)): canvas.itemconfigure(random.randint(1, 169), fill=random_color()) tk.after(80, main) def kill(a): tk.quit() canvas.bind_all('<KeyPress-Up>', kill) main() tk.mainloop()
Офлайн
Лучше без глобальных переменных. Вот такой вариант:
from tkinter import Tk,Canvas from random import randrange def random_color(): return '#{}{}{}'.format(format(randrange(255),'2x'),format(randrange(255),'2x'),format(randrange(255),'2x')) def mainloop(b=True,whoMoving=0): if b: whoMoving=randrange(col*row+1) canv.move(whoMoving,10,10) if b else canv.move(whoMoving,-10,-10) #смещает фигуру canv.itemconfigure(randrange(col*row+1),fill=random_color()) #меняет цвет фигуры tk.after(100,lambda: mainloop(not b,whoMoving)) def kill(a): tk.destroy() tk=Tk() canv=Canvas(tk,width=1000,height=700) canv.pack() col,row=16,11 #число строк и столбцов x1,y1=10,10 #первая точка треугольника x2,y2=10,60 #вторая точка треугольника x3,y3=50,35 #третья точка треугольника k=60 #коэффициент смещения фигур по столбцам и строкам [canv.create_polygon(x1+k*i,y1+k*j,x2+k*i,y2+k*j,x3+k*i,y3+k*j,fill=random_color()) for i in range(col) for j in range(row)] canv.bind_all('<KeyPress-Up>',kill) mainloop()
Офлайн
rami
Лучше без глобальных переменных. Вот такой вариант:
[canv.create_polygon(x1+k*i,y1+k*j,x2+k*i,y2+k*j,x3+k*i,y3+k*j,fill=random_color()) for i in range(col) for j in range(row)]
for i in range(col): for j in range(row): canv.create_polygon(x1+k*i,y1+k*j,x2+k*i,y2+k*j,x3+k*i,y3+k*j,fill=random_color())
canv.move(whoMoving,10,10) if b else canv.move(whoMoving,-10,-10)
Офлайн
rami
Лучше без глобальных переменных.
from tkinter import * import random tk = Tk() tk.resizable(0, 0) canvas = Canvas(tk, width=910, height=910, bg='grey', bd=0, highlightthickness=0) canvas.pack() x1 = 10; y1 = 10; x2 = 60; y2 = 60 #Начальные координаты первого шарика k = 60 #смещение между колонками и строками val = 7 #Сколько шариков двигать col = 15 #Колво колонок и строк def random_color(): color = '#%s%s%s' % ('%02x' % random.randrange(255), '%02x' % random.randrange(255), '%02x' % random.randrange(255)) return (color) def movingNumbers(val): whoMoving = [] for i in range(val): whoMoving.append(random.randint(1, 169)) return whoMoving def main(evenPass = True, whoMoving = movingNumbers(val)): if evenPass: whoMoving = movingNumbers(val) for a in range(val): canvas.move(whoMoving[a], 10, 10) else: for a in range(val): canvas.move(whoMoving[a], -10, -10) for i in range(val): canvas.itemconfigure(random.randint(1, 169), fill=random_color()) tk.after(50, lambda: main(not evenPass, whoMoving)) def kill(a): tk.quit() canvas.bind_all('<KeyPress-Escape>', kill) for i in range(col): for j in range(col): canvas.create_oval(x1+k*i, y1+k*j, x2+k*i, y2+k*j, fill=random_color(), outline='') main() #основной цикл tk.mainloop()
Отредактировано Brain (Май 6, 2018 00:28:59)
Офлайн
Скажите, в чем принципиальная разница между
tk.destroy()
tk.quit()
Офлайн
BrainНе должна, но может, это одно и то же, но мне нравится более компактный код.
Эта строка[canv.create_polygon(x1+k*i,y1+k*j,x2+k*i,y2+k*j,x3+k*i,y3+k*j,fill=random_color()) for i in range(col) for j in range(row)]
я так понимаю должна так выглядеть?for i in range(col): for j in range(row): canv.create_polygon(x1+k*i,y1+k*j,x2+k*i,y2+k*j,x3+k*i,y3+k*j,fill=random_color())
BrainДа, правильно будет '02x', но у меня '2x' тоже работает, хотя не стоит на это расчитывать.
В цветах где формат строки ‘02x’.
BrainЭто работает так:
Вот эту строку не совсем понял:canv.move(whoMoving,10,10) if b else canv.move(whoMoving,-10,-10)
'Выполняется если True' if "условие" else 'Выполняется если False'
from tkinter import *
from tkinter import Tk,Canvas
BrainУ меня на Маке tk.quit() не работает, а tk.destroy() закрывает окно.
Скажите, в чем принципиальная разница между
tk.destroy()
и
tk.quit()
?
Офлайн
rami
Вместо random.randint(1, 169) правильней писать random.randint(1, col*col), у вас ведь 225 фигур (15*15), первые 169 “танцуют”, а остальные 56 “делают вид, что им это не интересно”
Офлайн