Python 全球词典的麻烦 将tkinter作为tk导入 #messagebox不随tkinter自动导入 从tkinter将messagebox作为tkMessageBox导入 从tkinter导入ttk 从随机导入随机为rand 类正方形(对象): “”“用于每个方块的类”“” 定义初始化(自): self.mine_yn=False self.flag_yn=False self.prox_num=0#附近地雷的数量,parse_mines()将填写此信息。 self.button=None#ttk.button实例。 def parse_mines(): “看一个广场旁边有多少地雷, 存储在sqr_dict内的每个方形实例中。”“” 全球质量规则 全球地雷框架 print('in parse_mines,sqr_dict='+str(sqr_dict)) def try_a_square(sq):#sq=坐标字符串(键) 尝试: 如果sqr_dict[sq].mine_yn==True:返回1 如果sqr_dict[sq].mine_yn==False:返回0 除KeyError外: 打印(“+sq”的键错误) 返回0 n=0 对于范围(5)内的x: 对于范围(4)内的y: #检查8个相邻的方块。 n=n+try_a_square('x'+str(x+1)+'y'+str(y+1)) n=n+try_a_square('x'+str(x+1)+'y'+str(y)) n=n+try_a_square('x'+str(x+1)+'y'+str(y-1)) n=n+try_a_square('x'+str(x)+'y'+str(y+1)) n=n+try_a_square('x'+str(x)+'y'+str(y-1)) n=n+try_a_square('x'+str(x-1)+'y'+str(y+1)) n=n+try_a_square('x'+str(x-1)+'y'+str(y)) n=n+try_a_square('x'+str(x-1)+'y'+str(y-1)) 如果sqr_dict[('x'+str(x)+'y'+str(y))],则mine_yn==False: (sqr_dict[('x'+str(x)+'y'+str(y))))。prox_num=n 打印('x'+str(x)+'y'+str(y)+':'+str(n))#(调试)为每个sq打印n个 #sqr_dict[('x'+str(x)+'y'+str(y))]按钮。文本=(str(n))#(调试)在每个按钮上显示n。 n=0 def create_mine_field(): 全球地雷框架 全球质量规则 sqr_dict={} mine_frame=tk.Toplevel(根) mine_frame.grid() #如果用户点击“X”关闭窗口,该怎么办。 mine\u frame.协议(“WM\u删除\u窗口”,mine\u frame\u关闭) #创建正方形网格(按钮) 对于范围(5)内的x: 对于范围(4)内的y: 坐标='x'+str(x)+'y'+str(y) sqr_dict[coord]=Square() #打印('coord='+coord)#调试 #布满地雷 如果(兰德()*100
我想用tkinter做一个简单的扫雷游戏。如果我运行上面的代码,就会出现一个简单的“地雷”字段。但是,如果我取消对parser()的调用的注释,则不会显示任何内容,而且似乎它在sqr_dict字典中从未找到任何地雷。(parser()将为每个广场填写相邻矿井的编号)Python 全球词典的麻烦 将tkinter作为tk导入 #messagebox不随tkinter自动导入 从tkinter将messagebox作为tkMessageBox导入 从tkinter导入ttk 从随机导入随机为rand 类正方形(对象): “”“用于每个方块的类”“” 定义初始化(自): self.mine_yn=False self.flag_yn=False self.prox_num=0#附近地雷的数量,parse_mines()将填写此信息。 self.button=None#ttk.button实例。 def parse_mines(): “看一个广场旁边有多少地雷, 存储在sqr_dict内的每个方形实例中。”“” 全球质量规则 全球地雷框架 print('in parse_mines,sqr_dict='+str(sqr_dict)) def try_a_square(sq):#sq=坐标字符串(键) 尝试: 如果sqr_dict[sq].mine_yn==True:返回1 如果sqr_dict[sq].mine_yn==False:返回0 除KeyError外: 打印(“+sq”的键错误) 返回0 n=0 对于范围(5)内的x: 对于范围(4)内的y: #检查8个相邻的方块。 n=n+try_a_square('x'+str(x+1)+'y'+str(y+1)) n=n+try_a_square('x'+str(x+1)+'y'+str(y)) n=n+try_a_square('x'+str(x+1)+'y'+str(y-1)) n=n+try_a_square('x'+str(x)+'y'+str(y+1)) n=n+try_a_square('x'+str(x)+'y'+str(y-1)) n=n+try_a_square('x'+str(x-1)+'y'+str(y+1)) n=n+try_a_square('x'+str(x-1)+'y'+str(y)) n=n+try_a_square('x'+str(x-1)+'y'+str(y-1)) 如果sqr_dict[('x'+str(x)+'y'+str(y))],则mine_yn==False: (sqr_dict[('x'+str(x)+'y'+str(y))))。prox_num=n 打印('x'+str(x)+'y'+str(y)+':'+str(n))#(调试)为每个sq打印n个 #sqr_dict[('x'+str(x)+'y'+str(y))]按钮。文本=(str(n))#(调试)在每个按钮上显示n。 n=0 def create_mine_field(): 全球地雷框架 全球质量规则 sqr_dict={} mine_frame=tk.Toplevel(根) mine_frame.grid() #如果用户点击“X”关闭窗口,该怎么办。 mine\u frame.协议(“WM\u删除\u窗口”,mine\u frame\u关闭) #创建正方形网格(按钮) 对于范围(5)内的x: 对于范围(4)内的y: 坐标='x'+str(x)+'y'+str(y) sqr_dict[coord]=Square() #打印('coord='+coord)#调试 #布满地雷 如果(兰德()*100,python,dictionary,tkinter,Python,Dictionary,Tkinter,我想用tkinter做一个简单的扫雷游戏。如果我运行上面的代码,就会出现一个简单的“地雷”字段。但是,如果我取消对parser()的调用的注释,则不会显示任何内容,而且似乎它在sqr_dict字典中从未找到任何地雷。(parser()将为每个广场填写相邻矿井的编号) 我不明白为什么这个函数在被调用之前会引起麻烦。调用时不显示雷区。请给我你的建议。谢谢 没有显示的原因是您在根窗口的子窗口小部件上同时使用了pack和grid。在任何给定的窗口中,您只能使用其中一个。“但是,如果我取消对parser(
我不明白为什么这个函数在被调用之前会引起麻烦。调用时不显示雷区。请给我你的建议。谢谢 没有显示的原因是您在根窗口的子窗口小部件上同时使用了
pack
和grid
。在任何给定的窗口中,您只能使用其中一个。“但是,如果我取消对parser()的调用的注释”-我看不到对parser()的调用
,也看不到对parser
的任何定义。你的意思是写parse_mines()
?对不起,是的,这就是我的意思。我将start_button.pack()更改为start_button.grid()。现在所有的东西都在使用网格,但是在parse_mines()未注释的情况下,我仍然一无所获。@JayTaffer:当我运行你的代码时,我得到keyror:'x0y1'。你真的确定在一个循环中调用另一个循环中的
parse_mines`是正确的吗?请原谅我的无礼。是的,我不是想在循环中包含parse_mines()。再次感谢你!现在一切似乎都好了。
import tkinter as tk
#messagebox is not imported automatically w/ tkinter
from tkinter import messagebox as tkMessageBox
from tkinter import ttk
from random import random as rand
class Square(object):
""" class to use for each square """
def __init__(self):
self.mine_yn = False
self.flag_yn = False
self.prox_num = 0 # number of nearby mines, parse_mines() will fill this in.
self.button = None # ttk.Button instance.
def parse_mines():
"""Look at how many mines are next to a given square,
store in each Square instance that is inside of sqr_dict. """
global sqr_dict
global mine_frame
print('in parse_mines, sqr_dict='+str(sqr_dict))
def try_a_square(sq): #sq = coordinate string(key)
try:
if sqr_dict[sq].mine_yn == True: return 1
if sqr_dict[sq].mine_yn == False: return 0
except KeyError:
print('KeyError for '+sq)
return 0
n = 0
for x in range(5):
for y in range(4):
#check the 8 adjacent squares.
n = n + try_a_square('x'+str(x+1)+'y'+str(y+1))
n = n + try_a_square('x'+str(x+1)+'y'+str(y ))
n = n + try_a_square('x'+str(x+1)+'y'+str(y-1))
n = n + try_a_square('x'+str(x )+'y'+str(y+1))
n = n + try_a_square('x'+str(x )+'y'+str(y-1))
n = n + try_a_square('x'+str(x-1)+'y'+str(y+1))
n = n + try_a_square('x'+str(x-1)+'y'+str(y ))
n = n + try_a_square('x'+str(x-1)+'y'+str(y-1))
if sqr_dict[('x'+str(x)+'y'+str(y))].mine_yn == False:
(sqr_dict[('x'+str(x)+'y'+str(y))]).prox_num = n
print('x'+str(x)+'y'+str(y)+': '+str(n)) #(debug) print n for each sq
#sqr_dict[('x'+str(x)+'y'+str(y))].button.text=(str(n)) #(debug) show n on each button.
n = 0
def create_mine_field():
global mine_frame
global sqr_dict
sqr_dict = {}
mine_frame = tk.Toplevel(root)
mine_frame.grid()
#what to do if user hit 'X' to close window.
mine_frame.protocol("WM_DELETE_WINDOW", mine_frame_close)
# create grid of squares (buttons)
for x in range(5):
for y in range(4):
coord = 'x'+str(x) + 'y'+str(y)
sqr_dict[coord] = Square()
#print('coord='+coord) #debug
#populate with mines
if ( rand()*100 < mines_pct ):
sqr_dict[coord].mine_yn = True
print(str(sqr_dict[coord].mine_yn))
else:
sqr_dict[coord].mine_yn = False
if sqr_dict[coord].mine_yn:
t = '*'
else: t = ' '
# draw boxes
sqr_dict[coord].button = ttk.Button(mine_frame, text=t, width=3 )
sqr_dict[coord].button.grid(column=x, row=y)
# done, next: parse!
print('in create_mines, sqr_dict='+str(sqr_dict))
#parse_mines()
def root_close():
root.destroy()
def mine_frame_close():
root.destroy()
root = tk.Tk()
root.title("MineSweeper")
mines_pct = 20
start_button = ttk.Button(root,text="Start",command=create_mine_field)
start_button.pack()
root.mainloop()