Tkinter没有回应

时间:2015-10-12 16:53:58

标签: python tkinter

我是Python和所有编程的新手,所以也许是明显的错误。

我的图形窗口没有响应。该程序应该在随机位置绘制10张图片。然后它应该一遍又一遍地请求dxdy,没有结束,这些数字应该移动我的第一张弹出图片。图片在那里,它要求这两个参数,但它没有响应,而且当我插入它们时,没有任何反应。我认为代码应该是正确的,但我不确定。感谢您的回复:)

以下是代码:

import tkinter
c = tkinter.Canvas(width = 400,height = 400)
c.pack()
x1 = random.randrange(100, 400)
y1 = random.randrange(100, 400)
pic1 = tkinter.PhotoImage(file = 'images2-1.png')
c.create_image(x1, y1, image = pic1)
pic2 = tkinter.PhotoImage(file = 'images2-1.png')
for i in range (0,9):
    x = random.randrange(100, 400)
    y = random.randrange(100, 400)
    c.create_image(x, y, image = pic2)
    c.update()    
while 1:
    dx = int(input('zadaj dx: '))
    dy = int(input('zadaj dy: '))
    c.move(pic1, x1+dx, y1+dy)
    c.update()

2 个答案:

答案 0 :(得分:0)

有两个主要问题。首先,看看Tk中的simple Hello World program,了解它应该如何构建。基本上,你没有调用Tk的主循环。但是,用户输入将始终阻止应用程序主循环,因此您需要将该工作移动到另一个线程。

希望它有所帮助!

答案 1 :(得分:0)

正如对上一个答案的评论中所建议的那样:使其成为“纯粹”的GUI应用程序。添加一些标签,输入框和按钮在概念上比在文本控制台中保留用户输入并使用线程将其与GUI结合起来更简单。

import tkinter as tk
from itertools import islice
from random import randrange


def iter_random_coordinates(lower, upper):
    while True:
        yield (randrange(lower, upper), randrange(lower, upper))


class MainFrame(tk.Frame):

    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.canvas = tk.Canvas(self, width=400, height=400)
        self.canvas.pack(side=tk.TOP)
        self.image = tk.PhotoImage(file='test.gif')
        random_coordinates = iter_random_coordinates(100, 400)
        self.x, self.y = next(random_coordinates)
        self.image_id = self.canvas.create_image(
            self.x, self.y, image=self.image
        )
        for x, y in islice(random_coordinates, 9):
            self.canvas.create_image(x, y, image=self.image)

        frame = tk.Frame(self)
        tk.Label(frame, text='zadaj dx:').grid(row=0, column=0, sticky=tk.W)
        self.dx_entry = tk.Entry(frame)
        self.dx_entry.grid(row=0, column=1, sticky=tk.EW)
        tk.Label(frame, text='zadaj dy:').grid(row=1, column=0, sticky=tk.W)
        self.dy_entry = tk.Entry(frame)
        self.dy_entry.grid(row=1, column=1, sticky=tk.EW)
        frame.pack(side=tk.TOP)

        tk.Button(self, text='Move', command=self.do_move).pack(side=tk.TOP)
        self.dx_entry.focus_set()

    def do_move(self):
        dx = int(self.dx_entry.get())
        dy = int(self.dy_entry.get())
        self.canvas.coords(self.image_id, self.x + dx, self.y + dy)


def main():
    root = tk.Tk()
    frame = MainFrame(root)
    frame.pack()
    root.mainloop()


if __name__ == '__main__':
    main()