Python Tkinter骰子程序无报错但运行行为异常问题咨询
Tkinter骰子程序问题排查
核心问题列表
- 事件绑定语法错误
你写的v.bind_all ('<space>', dob ())中给dob加了括号,会直接立即执行dob函数,而不是将函数作为回调绑定给空格事件,绑定事件时只需传递函数名,不需要加括号。 - 错误使用无限循环阻塞Tkinter主事件循环
Tkinter界面依赖内置的mainloop()处理用户交互、重绘等事件,你写的while True死循环会完全阻塞界面响应,同时随机数生成的位置错误,你把dobás = randint(1,6)放在死循环里不停刷新,而正确逻辑应该是每次按下空格触发dob函数时才生成新的随机点数。 - 圆点坐标参数顺序错误
create_oval需要传入的参数格式是(x1, y1, x2, y2),其中x1<x2、y1<y2代表左上角到右下角的坐标,你代码里kettőb、négyb、négyc、hatd的坐标都写反了,会导致圆点显示位置异常。 - 缺少Tkinter主循环启动代码
你没有调用ablak.mainloop()启动界面主循环,界面无法持续运行。
修正后的完整代码
from random import randint from tkinter import * ablak = Tk() ablak.title('Dobókocka') v = Canvas(ablak, width=500, height=500, bg='orange') v.pack() a = 'white' v.create_rectangle(200, 200, 300, 300, fill='red') v.create_text(250, 20, text='Nyomd meg a \'space\'-t!') # 修正所有圆点坐标,保证x1<x2,y1<y2 egy = v.create_oval(240, 240, 260, 260, outline=a, fill=a, state=NORMAL) kettőa = v.create_oval(220, 220, 240, 240, outline=a, fill=a, state=HIDDEN) kettőb = v.create_oval(260, 260, 280, 280, outline=a, fill=a, state=HIDDEN) négyb = v.create_oval(260, 220, 280, 240, outline=a, fill=a, state=HIDDEN) négyc = v.create_oval(220, 260, 240, 280, outline=a, fill=a, state=HIDDEN) hatc = v.create_oval(220, 240, 240, 260, outline=a, fill=a, state=HIDDEN) hatd = v.create_oval(260, 240, 280, 260, outline=a, fill=a, state=HIDDEN) def egyes(): v.itemconfig(egy, state=NORMAL) def kettes(): v.itemconfig(kettőa, state=NORMAL) v.itemconfig(kettőb, state=NORMAL) def hármas(): kettes() egyes() def négyes(): kettes() v.itemconfig(négyb, state=NORMAL) v.itemconfig(négyc, state=NORMAL) def ötös(): négyes() egyes() def hatos(): négyes() v.itemconfig(hatc, state=NORMAL) v.itemconfig(hatd, state=NORMAL) def dob(event=None): # 每次触发dob函数时生成新的随机点数 dobás = randint(1, 6) # 先隐藏所有圆点 v.itemconfig(egy, state=HIDDEN) v.itemconfig(kettőa, state=HIDDEN) v.itemconfig(kettőb, state=HIDDEN) v.itemconfig(négyb, state=HIDDEN) v.itemconfig(négyc, state=HIDDEN) v.itemconfig(hatc, state=HIDDEN) v.itemconfig(hatd, state=HIDDEN) # 根据点数显示对应圆点 if dobás == 1: egyes() elif dobás == 2: kettes() elif dobás == 3: hármas() elif dobás == 4: négyes() elif dobás == 5: ötös() else: hatos() # 绑定空格事件,只需要传函数名,不加括号 v.bind_all('<space>', dob) # 启动Tkinter主循环 ablak.mainloop()
内容的提问来源于stack exchange,提问作者user16681179
相关产品推荐
相关产品推荐

