Уведомления

Группа в Telegram: @pythonsu

#1 Май 5, 2018 14:02:19

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение программы

ДД. Есть код с бесконечным циклом, пробую на кнопку повесить завершение, не закрывается прога, подскажите, что я не так делаю. Пробовал 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()

Офлайн

#2 Май 5, 2018 14:31:55

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Завершение программы

Я не спец по TK, но mainloop должен быть самого TK, в котором он обрабатывает события. Вот пример. Я думаю что у Вас ничего не происходит потому что обработка нажатия клавиш не происходит. Потому что в целом Вы не правильно пользуетесь TK.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Май 5, 2018 15:45:05

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

Завершение программы

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()
.....



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

Отредактировано PEHDOM (Май 5, 2018 15:45:17)

Офлайн

#4 Май 5, 2018 18:30:54

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение программы

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()

Офлайн

#5 Май 5, 2018 21:34:58

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Завершение программы

Лучше без глобальных переменных. Вот такой вариант:

 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()

Офлайн

#6 Май 5, 2018 23:39:21

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение программы

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) 

Офлайн

#7 Май 6, 2018 00:28:43

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение программы

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)

Офлайн

#8 Май 6, 2018 00:32:24

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение программы

Скажите, в чем принципиальная разница между

 tk.destroy()
и
 tk.quit()
?

Офлайн

#9 Май 6, 2018 09:35:32

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Завершение программы

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 “делают вид, что им это не интересно”

Офлайн

#10 Май 6, 2018 10:55:46

Brain
Зарегистрирован: 2016-05-22
Сообщения: 49
Репутация: +  0  -
Профиль   Отправить e-mail  

Завершение программы

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

Да, это под вечер уже не углядел, поначалу 13*13 был массив фигур, лучше через переменную.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version