很难找到这方面的例子,所以希望这个答案能帮助其他人。在使用pySDL2包装API时,您需要了解ctypes以进行不同的操作。在某些情况下,API已经被扩展以避免一些看似神秘的操作。下面提供了一个示例代码,并进行了解释。
from sdl2 import *
import tkinter as tk
from tkinter import *
import random, ctypes
def draw():
global renderer
x1 = ctypes.c_int(random.randrange(0, 600))
y1 = ctypes.c_int(random.randrange(0, 500))
x2 = ctypes.c_int(random.randrange(0, 600))
y2 = ctypes.c_int(random.randrange(0, 500))
r = ctypes.c_ubyte(random.randrange(0, 255))
g = ctypes.c_ubyte(random.randrange(0, 255))
b = ctypes.c_ubyte(random.randrange(0, 255))
SDL_SetRenderDrawColor(renderer, r, g, b, ctypes.c_ubyte(255))
SDL_RenderDrawLine(renderer, x1, y1, x2, y2)
def sdl_update():
global window, event, renderer
SDL_RenderPresent(renderer);
if SDL_PollEvent(ctypes.byref(event)) != 0:
if event.type == SDL_QUIT:
SDL_DestroyRenderer(renderer)
SDL_DestroyWindow(window)
SDL_Quit()
root = tk.Tk()
embed = tk.Frame(root, width = 500, height = 500)
embed.grid(columnspan = (600), rowspan = 500)
embed.pack(side = LEFT)
buttonwin = tk.Frame(root, width = 75, height = 500)
buttonwin.pack(side = LEFT)
button1 = Button(buttonwin,text = 'Draw', command=draw)
button1.pack(side=LEFT)
root.update()
SDL_Init(SDL_INIT_VIDEO)
window = SDL_CreateWindowFrom(embed.winfo_id())
renderer = SDL_CreateRenderer(window, -1, 0)
SDL_SetRenderDrawColor(renderer, ctypes.c_ubyte(255), ctypes.c_ubyte(255),
ctypes.c_ubyte(255), ctypes.c_ubyte(255))
SDL_RenderClear(renderer)
event = SDL_Event()
draw()
while True:
sdl_update()
root.update()
上面的示例展示了您可以创建自己的tkinter GUI,然后初始化您的pySDL2代码,从您想要的任何框架或窗口创建一个窗口,在这种情况下,我选择使用了一个我创建的名为“embed”的框架。使用可用的
winfo_id()
函数(请参阅tkinter文档),我们可以获取窗口的句柄。
draw()
函数只是使用渲染模块进行绘图。请注意,对于期望特定类型的SDL2函数,
ctypes
被用于以SDL2所期望的方式格式化那些参数。在主while循环中,调用
sdl_update()
函数检查SDL事件。然后是根窗口(tkinter)更新调用。
我们创建的
Button
将其命令链接到
draw()
,当单击此按钮时,随机颜色的线条出现在与SDL2窗口链接的帧中。
这段代码改编自
PythonNut关于pygame和tkinter的这个SO答案。该代码最初由用户
Alex Sallons编写。