Найти - Пользователи
Полная версия: Завершение программы
Начало » Python для новичков » Завершение программы
1 2
Brain
ДД. Есть код с бесконечным циклом, пробую на кнопку повесить завершение, не закрывается прога, подскажите, что я не так делаю. Пробовал 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()
JOHN_16
Я не спец по TK, но mainloop должен быть самого TK, в котором он обрабатывает события. Вот пример. Я думаю что у Вас ничего не происходит потому что обработка нажатия клавиш не происходит. Потому что в целом Вы не правильно пользуетесь TK.
PEHDOM
JOHN_16
Я думаю что у Вас ничего не происходит потому что обработка нажатия клавиш не происходит. Потому что в целом Вы не правильно пользуетесь TK.
Как ни странно но происходит, хотя конечно такая реализация mainloop является тем еще колхозом.
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()
.....

Brain
PEHDOM
PEHDOM
неправильно делаете mainloop

А для чего вы ввели переменную tk.ml?

Посмотрите код, так правильно использовать майнлуп? Единственное что глобальные переменные пришлось создать, насколько это грамотно?

 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()
rami
Лучше без глобальных переменных. Вот такой вариант:
 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()
Brain
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())

В цветах где формат строки ‘02x’.

И mainloop чето ничего не делает у меня в вашем варианте.
Вот эту строку не совсем понял:
  canv.move(whoMoving,10,10) if b else canv.move(whoMoving,-10,-10) 
Brain
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
Скажите, в чем принципиальная разница между

 tk.destroy()
и
 tk.quit()
?
rami
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’.
Да, правильно будет '02x', но у меня '2x' тоже работает, хотя не стоит на это расчитывать.


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.destroy()
и
tk.quit()
?
У меня на Маке tk.quit() не работает, а tk.destroy() закрывает окно.


Вместо random.randint(1, 169) правильней писать random.randint(1, col*col), у вас ведь 225 фигур (15*15), первые 169 “танцуют”, а остальные 56 “делают вид, что им это не интересно”
Brain
rami
Вместо random.randint(1, 169) правильней писать random.randint(1, col*col), у вас ведь 225 фигур (15*15), первые 169 “танцуют”, а остальные 56 “делают вид, что им это не интересно”

Да, это под вечер уже не углядел, поначалу 13*13 был массив фигур, лучше через переменную.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB