Python tkinter按钮不显示

时间:2017-09-12 11:45:27

标签: python tkinter

我正在制作纸牌游戏(称为怪物大师)来开发我的蟒蛇技能,特别是OOP。

我有一个具有一些静态对象的GUI:玩家1的桌面,玩家2的侧面,中间的一条小线,我现在正试图实现一个' end turn'按钮。

我尝试了很多不同的东西试图让这个按钮显示,但即​​使没有错误,我也无法让它出现。只是说为了试图用这个按钮来解决问题,我暂时删除了一些注释掉的行。

这是我目前正在尝试使用的代码:

def RunGame():
class App():
    """docstring for App"""

    def draw():
        # Setting up canvas dimensions

        canvas_width = 640
        canvas_height = 480

        master = Toplevel()
        master.title("Monster Master by Charles Cameron - Game")
        master.resizable(width=False, height=False)
        master.geometry("640x480")

        w = Canvas(master, 
                   width=canvas_width, 
                   height=canvas_height)
        w.pack()

        # Drawing static objects 
        CentrePoints = [(0, canvas_height/2), (canvas_width/2, canvas_height/2), 
            (canvas_width, canvas_height/2)] 
            #Left, centre and right centres (save me from retyping them)

        Player1Area = w.create_rectangle(CentrePoints[0], canvas_width,
            canvas_height, fill="#303AFE") #Player1 Area
        Player2Area = w.create_rectangle(0, 0, CentrePoints[2], 
            fill="#C31B1B") #Player2 Area

        Barrier = w.create_line(CentrePoints[0], CentrePoints[2], 
            fill="#0090E3", width=20) # Centre barrier

        # class GameBtn():
        #   class EndTurnBtn():
        #       def __init__(self, BtnName, master):
        BtnName = Button(master, bg="white", command=lambda:print("Clicked!"))

        image = ImageTk.PhotoImage(file="imgs\EndTurn.png")
        BtnName.config(image=image, width="70", height="70")

        BtnName.pack(side=RIGHT)

        # ChangeTurn = GameBtn.EndTurnBtn('ChangeTurn', master)

        master.mainloop()

Window = App()
App.draw()

当我在自己的脚本中尝试时,实际按钮的按钮代码工作正常,但当我把它放在这个程序中时停止工作。

希望问题不是一个愚蠢的问题,蟒蛇的业余爱好者仍然老实无法在网上找到答案。

非常感谢

1 个答案:

答案 0 :(得分:2)

您的按钮存在,但它已超过窗口边缘。这是因为你将窗口设置为640x480,然后用640x480画布完全填充它。删除master.geometry("640x480")行,窗口将拉伸以包含画布和按钮。

您可能正在思考"但我不希望按钮出现在画布的侧面。我希望按钮在画布上。画布只存在,因为我想为背景的部分着色"。使用create_window可以在画布上嵌入小部件(请参阅How to place a widget in a Canvas widget in Tkinter?),但通过将Frame对象堆叠在一起并为其提供单独的颜色来创建彩色背景可能更实用。例如:

from tkinter import Tk, Frame, Button

root = Tk()
root.geometry("640x480")
top_player_frame = Frame(root, height=230, bg="red")
barrier = Frame(root, height=20, bg="green")
bottom_player_frame = Frame(root, height = 230, bg="blue")

#configure column 0 so frames can stretch to fit width of window
root.columnconfigure(0, weight=1)

top_player_frame.grid(row=0, sticky="we")
barrier.grid(row=1, sticky="we")
bottom_player_frame.grid(row=2, sticky="we")

bottom_player_end_turn_button = Button(bottom_player_frame, text="End Turn")
#use `place` here because `pack` or `grid` will collapse the frame to be only as tall as all the widgets it contains, i.e. just this button
bottom_player_end_turn_button.place(x=10,y=10)

root.mainloop()

结果:

enter image description here