События Tkinter вне основного цикла?

Программа, которую я пишу, имеет окно 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()

person SaxSalute    schedule 09.06.2011    source источник
comment
Вы пытались запустить tkinter mainloop в отдельном потоке?   -  person Aivar    schedule 28.07.2012


Ответы (1)


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

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

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

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

person Bryan Oakley    schedule 09.06.2011