【发布时间】:2021-03-23 17:32:10
【问题描述】:
我正在尝试制作一个在随机位置制作一个圆圈的函数,作为回报,它第一次正确执行但之后每次我尝试执行它都不起作用。请帮助我,这是代码:
size = 200
class Spots():
def __init__(self):
self.avaible = True
def taken(self):
self.avaible = False
a1 = Spots()
a2 = Spots()
a3 = Spots()
b1 = Spots()
b2 = Spots()
b3 = Spots()
c1 = Spots()
c2 = Spots()
c3 = Spots()
spots = (a1,a2,a3,b1,b2,b3,c1,c2,c3)
import random as r
from tkinter import *
tk = Tk()
cv = Canvas(tk, width = 200 + size * 3, height = 200 + size * 3)
cv.pack()
def tkO():
rch = r.choice(spots)
x = 100
y = 100
while a1.avaible == True or a2.avaible == True or a3.avaible == True or b1.avaible == True or b2.avaible == True or b3.avaible == True or c1.avaible == True or c2.avaible == True or c3.avaible == True:
while rch.avaible == False:
rch = r.choice(spots)
break
rch.taken
if "a" in str(rch):
y = 100
if "1" in str(rch):
x = 100
if "2" in str(rch):
x = 100 + size
if "3" in str(rch):
x = 100 + size * 2
if "b" in str(rch):
y = 100 + size
if "1" in str(rch):
x = 100
if "2" in str(rch):
x = 100 + size
if "3" in str(rch):
x = 100 + size * 2
if "c" in str(rch):
y = 100 + size * 2
if "1" in str(rch):
x = 100
if "2" in str(rch):
x = 100 + size
if "3" in str(rch):
x = 100 + size * 2
cv.create_oval(x,y,x+size,y+size)
任何帮助将不胜感激。此外,如果您能找到一种方法让 tkO() 函数中的混乱更高效(更短),那也会有所帮助。
【问题讨论】:
-
“不起作用”是什么意思?第二次有什么不同?你做了什么来调试它?您是否验证过该函数被多次调用?您是否检查过计算,看看它是否每次都计算不同的坐标?
-
当我通过 Python Shell 执行它时,在 tk 中它什么也不做,我通过 Shell 调用该函数以查看是否一切正确,尽管它不是。我尝试了一些更改来修复一些错误,但最后我只有 1 个圆圈。
-
你确定你只有一个圈子,还是有可能你正在创建多个相同的圈子?这对您来说似乎是一件容易的事情,只需几个放置良好的打印语句即可进行调试。
-
有一点是肯定的,像 if "a" in str(rch) 这样的语句不会像你认为的那样做。您是否知道 str(rch) 将返回类似于 '<__main__.spots object at>' 的内容? “a”、“b”和“c”将始终在该字符串中?
-
感谢您的帮助!我设法用一个全新的元组修复了绝对混乱,并将 rch 更改为 rchobject,而 rch 是字符串,它开始正常工作!太感谢了。没有你,我不可能做到这一点。