События Tkinter вне основного цикла? - PullRequest
4 голосов
/ 09 июня 2011

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

from Tkinter import *
import random
import time

def getCoords(event):
    xm, ym = event.x, event.y
    str1 = "mouse at x=%d  y=%d" % (xm, ym)
    print str1

class iciclePhysics(object):
    def __init__(self, fallrange, speed=5):
        self.speed = speed
        self.xpos = random.choice(range(0,fallrange))
        self.ypos = 0

    def draw(self,canvas):
        try:
            self.id = canvas.create_polygon(self.xpos-10, self.ypos, self.xpos+10, self.ypos, self.xpos, self.ypos+25, fill = 'lightblue')
        except:
            pass

    def fall(self,canvas):
        self.ypos+=self.speed
        canvas.move(self.id, 0, self.ypos)



root = Tk()
mainFrame = Frame(root, bg= 'yellow', width=300, height=200)
mainFrame.pack()
mainCanvas = Canvas(mainFrame, bg = 'black', height = 500, width = 500, cursor = 'circle')
mainCanvas.bind("<Motion>", getCoords)
mainCanvas.pack()

root.resizable(0, 0)
difficulty = 1500
#root.mainloop()
currentIcicles = [iciclePhysics(difficulty)]
root.update()
currentIcicles[0].draw(mainCanvas)
root.update_idletasks() 
time.sleep(0.1)
currentIcicles[0].fall(mainCanvas)
root.update_idletasks() 
tracker = 0
sleeptime = 0.04


while True:
    tracker+=1
    time.sleep(sleeptime)
    if tracker % 3 == 0 and difficulty > 500:
        difficulty -= 1
    elif difficulty <= 500:
        sleeptime-=.00002
    currentIcicles.append(iciclePhysics(difficulty))
    currentIcicles[len(currentIcicles)-1].draw(mainCanvas)

    for i in range(len(currentIcicles)):
        currentIcicles[i].fall(mainCanvas)
        root.update_idletasks()

    for i in currentIcicles:
        if i.ypos >= 90:
            currentIcicles.remove(i)
    root.update_idletasks()

1 Ответ

6 голосов
/ 09 июня 2011

Нет пути. Движение мыши представлено в графическом интерфейсе как серия событий. Для обработки событий должен быть запущен цикл обработки событий.

Кроме того, вы должны никогда не спать в приложении с графическим интерфейсом. Все, что делает, это замораживает GUI во время сна.

Еще один совет: вам нужно создать сосульку только один раз; чтобы упасть, вы можете использовать move метод canvas.

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

...