Почему холст появляется над виджетом в tkinter? - PullRequest
0 голосов
/ 27 апреля 2018

Я использую tkinter в python3. Я создал класс die как подкласс виджета canvas. Затем я создал подкласс исходного класса кристаллов, который позволяет мне заморозить кристалл и предотвратить его бросок. Наконец, я создал собственный виджет в качестве подкласса фрейма, который содержит как замораживаемый кристалл, так и кнопку замораживания переключателя. Тем не менее, даже несмотря на то, что я создаю сетку на холсте матрицы перед тем, как наложить сетку на кнопку, кнопка все равно появляется над холстом. (Не удалось попытаться контролировать строки вручную) Вот мой код:

from tkinter import *
import random

class GUIDie(Canvas):
    '''6-sided Die class for GUI'''

    def __init__(self,master,valueList=[1,2,3,4,5,6],colorList=['black']*6):
        '''GUIDie(master,[valueList,colorList]) -> GUIDie
        creates a GUI 6-sided die
          valueList is the list of values (1,2,3,4,5,6 by default)
          colorList is the list of colors (all black by default)'''
        # create a 60x60 white canvas with a 5-pixel grooved border
        Canvas.__init__(self,master,width=60,height=60,bg='white',\
                        bd=5,relief=GROOVE)
        # store the valuelist and colorlist
        self.valueList = valueList
        self.colorList = colorList
        # initialize the top value
        self.top = 1

    def get_top(self):
        '''GUIDie.get_top() -> int
        returns the value on the die'''
        return self.valueList[self.top-1]

    def roll(self):
        '''GUIDie.roll()
        rolls the die'''
        self.top = random.randrange(1,7)
        self.draw()

    def draw(self):
        '''GUIDie.draw()
        draws the pips on the die'''
        # clear old pips first
        self.erase()
        # location of which pips should be drawn
        pipList = [[(1,1)],
                   [(0,0),(2,2)],
                   [(0,0),(1,1),(2,2)],
                   [(0,0),(0,2),(2,0),(2,2)],
                   [(0,0),(0,2),(1,1),(2,0),(2,2)],
                   [(0,0),(0,2),(1,0),(1,2),(2,0),(2,2)]]
        for location in pipList[self.top-1]:
            self.draw_pip(location,self.colorList[self.top-1])

    def draw_pip(self,location,color):
        '''GUIDie.draw_pip(location,color)
        draws a pip at (row,col) given by location, with given color'''
        (centerx,centery) = (17+20*location[1],17+20*location[0])  # center
        self.create_oval(centerx-5,centery-5,centerx+5,centery+5,fill=color)

    def erase(self):
        '''GUIDie.erase()
        erases all the pips'''
        pipList = self.find_all()
        for pip in pipList:
            self.delete(pip)


class GUIFreezeableDie(GUIDie):
    '''a GUIDie that can be "frozen" so that it can't be rolled'''

    def __init__(self,master,valueList=[1,2,3,4,5,6],colorList=['black']*6):
        '''GUIFreezeableDie(master,[valueList,colorList]) -> GUIFreezeableDie
        creates a GUI 6-sided freeze-able die
          valueList is the list of values (1,2,3,4,5,6 by default)
          colorList is the list of colors (all black by default)'''
        # you add code here
        GUIDie.__init__(self, master, valueList, colorList)
        self.isFrozen = False

    def is_frozen(self):
        '''GUIFreezeableDie.is_frozen() -> bool
        returns True if the die is frozen, False otherwise'''
        return self.isFrozen

    def toggle_freeze(self):
        '''GUIFreezeableDie.toggle_freeze()
        toggles the frozen status'''
        if self.is_frozen():
            self.isFrozen = False
            self.configure(background = "white")
        else:
            self.isFrozen = True
            self.configure(background = "grey")

    def roll(self):
        '''GuiFreezeableDie.roll()
        overloads GUIDie.roll() to not allow a roll if frozen'''
        if not self.is_frozen():
            GUIDie.roll(self)
class GUIDieSet(Frame):
    def __init__(self,master,valueList=[1,2,3,4,5,6],colorList=['black']*6):
        '''GUIFreezeableDie(master,[valueList,colorList]) -> GUIFreezeableDie
        creates a GUI 6-sided freeze-able die
          valueList is the list of values (1,2,3,4,5,6 by default)
          colorList is the list of colors (all black by default)'''
        Frame.__init__(self,master)
        self.grid()
        self.die = GUIFreezeableDie(master, valueList, colorList)
        self.die.grid()
        self.toggleFreeze = Button(self,text='Freeze',command=self.die.toggle_freeze)
        self.toggleFreeze.grid(row=1)
    def roll(self):
        self.die.roll()
class FreezeTest(Frame):
    '''a small application to test the freezeable die'''

    def __init__(self,master):
        Frame.__init__(self,master)
        self.grid()
        self.die = GUIDieSet(self)
        self.die.grid()
# test application
root = Tk()
test = TestFrame(root)
root.mainloop()

1 Ответ

0 голосов
/ 27 апреля 2018

В классе GUIDieSet() удалите строку self.grid() в __init()__, и она, кажется, работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...