1

我正在尝试使用 python 和 tkinter 重新创建棋盘游戏垄断。我知道如何在画布或框架上放置标签,但是我应该如何从类中的另一个函数运行此命令?我尝试使用 Board 类中的一些函数,但随后出现错误,即标签、画布等未定义,因为这种情况发生在__init__(self,parent). 我该如何解决这些错误?还是我应该对此采取不同的方法?希望我把我的问题说清楚了。

import tkFileDialog
from random import randint

class Board(Frame):
    def __init__(self,parent):


        ##create the board
        frame = Frame(parent)
        frame.pack()
        Frame.__init__(self,parent)

        frame2 = Frame(frame)
        frame2.pack()

        c=Canvas(frame2,width=480,height=480)
        c.pack(expand=YES,fill=BOTH)
        c.background=PhotoImage(file='Board.gif')
        c.create_image(0,0,image=c.background,anchor='nw')

        ##Add player 1
        player1=PhotoImage(file='plane.gif')
        label_player1 = Label(c,image=player1)
        label_player1.image=player1
        label_player1.place(x=430,y=420)

        ##Add player 2
        player2=PhotoImage(file='car.gif')
        label_player2 = Label(c,image=player2)
        label_player2.image=player2
        label_player2.place(x=430,y=450)

        button = Button(frame, text="Next turn", command=self.next_turn)
        button.pack()

        button = Button(frame, text="Roll the dice", command=self.roll)
        button.pack()

    def roll(self):
        number=randint(2,12)
        if b==0:
            self.place_player_down()
        return number

    def place_player_down(self):

        for i in range(number+1):
            h=int(430-i*30)
            while h>=0:
                player2=PhotoImage(file='car.gif')
                label_player2 = Label(c,image=player2)
                label_player2.image=player2
                label_player2.place(x=h,y=420)

root = Tk()
board = Board(root)
board.pack()
root.mainloop()
4

1 回答 1

2

该方法是正确的(将您的 Tkinter 小部件包装在一个类中,并使用事件处理函数作为方法),但是您忘记使用以下引用将小部件设置为类的属性self

class Board(Frame):
    def __init__(self,parent):
        # ...
        self.c = Canvas(frame2,width=480,height=480)
        self.c.pack(expand=YES,fill=BOTH)
        # ...

    def place_player_down(self):
        # Use 'self.c', not just 'c'

我认为您想对 value 做类似的事情number,但在这种情况下,我会将其作为参数发送到place_player_down

def roll(self):
    number=randint(2,12)
    if b==0:
        self.place_player_down(number)
    return number  # Keep in mind that this value is returned but not used anymore

def place_player_down(self, number):
    # Use 'number'
于 2013-05-31T22:05:30.967 回答