如何为 pygame 创建这个 tkinter 菜单栏

Posted

技术标签:

【中文标题】如何为 pygame 创建这个 tkinter 菜单栏【英文标题】:How to create this tkinter menubar for pygame 【发布时间】:2015-01-10 03:32:45 【问题描述】:

我想在 pygame 中创建一个菜单栏,就像在 tkinter 中一样。

from tkinter import *
def donothing():
   filewin = Toplevel(root)
   button = Button(filewin, text="Do nothing button")
   button.pack()

root = Tk()
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New", command=donothing)
filemenu.add_command(label="Open", command=donothing)
filemenu.add_command(label="Save", command=donothing)
filemenu.add_command(label="Save as...", command=donothing)
filemenu.add_command(label="Close", command=donothing)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Undo", command=donothing)

editmenu.add_separator()

editmenu.add_command(label="Cut", command=donothing)
editmenu.add_command(label="Copy", command=donothing)
editmenu.add_command(label="Paste", command=donothing)
editmenu.add_command(label="Delete", command=donothing)
editmenu.add_command(label="Select All", command=donothing)

menubar.add_cascade(label="Edit", menu=editmenu)
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="Help Index", command=donothing)
helpmenu.add_command(label="About...", command=donothing)
menubar.add_cascade(label="Help", menu=helpmenu)

root.config(menu=menubar)
root.mainloop()

这是 tkinter 代码,但有人知道如何在 pygame 中以完全相同的方式创建一些东西吗?

谢谢。

【问题讨论】:

【参考方案1】:

我使用 os.environ 将 pyGame 和 tkiter 结合起来,所以在你的 tkinter 里面有一个 pygame 窗口:

from tkinter import *
from pygame import *
from pygame.locals import *
import os

我为pygame添加了一个框架:

def donothing():
   filewin = Toplevel(root)
   button = Button(filewin, text="Do nothing button")
   button.pack()

root = Tk()
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)
filemenu.add_command(label="New", command=donothing)
filemenu.add_command(label="Open", command=donothing)
filemenu.add_command(label="Save", command=donothing)
filemenu.add_command(label="Save as...", command=donothing)
filemenu.add_command(label="Close", command=donothing)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
editmenu = Menu(menubar, tearoff=0)
editmenu.add_command(label="Undo", command=donothing)

editmenu.add_separator()

editmenu.add_command(label="Cut", command=donothing)
editmenu.add_command(label="Copy", command=donothing)
editmenu.add_command(label="Paste", command=donothing)
editmenu.add_command(label="Delete", command=donothing)
editmenu.add_command(label="Select All", command=donothing)

menubar.add_cascade(label="Edit", menu=editmenu)
helpmenu = Menu(menubar, tearoff=0)
helpmenu.add_command(label="Help Index", command=donothing)
helpmenu.add_command(label="About...", command=donothing)
menubar.add_cascade(label="Help", menu=helpmenu)

root.config(menu=menubar)

embed = Frame(root, width=640, height=480)
embed.pack()

这是添加的环境:

# Tell pygame's SDL window which window ID to use
os.environ['SDL_WINDOWID'] = str(embed.winfo_id())
# Show the window so it's assigned an ID.
root.update()

# Usual pygame initialization
pygame.init()

# Dimensions should match those used in the embed frame
screen = pygame.display.set_mode((640, 480))

running = True
def done():
    global running
    running = False

root.protocol("WM_DELETE_WINDOW", done)
while running:
    # game logic goes here
    pygame.display.flip()  # (or pygame.display.update())
    root.update_idletasks()
    root.update()
pygame.quit()

希望能有所帮助!

【讨论】:

【参考方案2】:

我认为在 pygame 中集成 tkinter 菜单栏是不可能的,它们是不同的工具。

我看到你唯一能做的就是使用 pygame 直接创建菜单栏,只使用屏幕的一部分作为主场景,另一部分作为菜单栏,可以使用按钮(使用矩形或类似对象创建)。

您还有另一种选择,即创建一个单独的 tkinter 根窗口(不建议这样做,因为您将有 2 个主循环互相争斗:来自 tkinter 的主循环em> 应用程序和来自 pygame 应用程序的应用程序),并与 pygame 主应用程序并行运行。

这些帖子可以帮助您实现第二种选择:

    Is there anything I need aware of using Tkinter and pygame together?

    What gui toolkit should I use with Pygame?

    What's the best way to add a GUI to a Pygame application?

    Mac and Windows compatible GUI for Python, which is easy to install and works with pygame?

    Python Game using pyGame with Window Menu elements

显然,您还可以使用库wxPython,它允许您在普通 wxPython 窗口中集成pygame 窗口.

【讨论】:

以上是关于如何为 pygame 创建这个 tkinter 菜单栏的主要内容,如果未能解决你的问题,请参考以下文章

我无法将我的 pygame 游戏链接到我的 tkinter GUI

tkinter - 如何为文本设置字体?

Tkinter:如何为画布矩形的轮廓着色?

如何为 Tkinter 条目小部件设置默认文本

如何为 TKINTER 中的条目总和定位 def

[Pygame&tkinter]真·中文输入框