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 全球词典的麻烦 将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(

我想用tkinter做一个简单的扫雷游戏。如果我运行上面的代码,就会出现一个简单的“地雷”字段。但是,如果我取消对parser()的调用的注释,则不会显示任何内容,而且似乎它在sqr_dict字典中从未找到任何地雷。(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()