我正在制作纸牌游戏(称为怪物大师)来开发我的蟒蛇技能,特别是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()
当我在自己的脚本中尝试时,实际按钮的按钮代码工作正常,但当我把它放在这个程序中时停止工作。
希望问题不是一个愚蠢的问题,蟒蛇的业余爱好者仍然老实无法在网上找到答案。
非常感谢
答案 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()
结果: