[Pygame&tkinter]真·中文输入框
Posted 该醒醒啦
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Pygame&tkinter]真·中文输入框相关的知识,希望对你有一定的参考价值。
前言
之前看到过一篇不错的文章,点个赞。
关于输入框,pygame还是比较坑的,没有内置,遂产生想法:tk和pg结合
1.创建窗口
tk嵌入pg请参考这,支持三个平台,不用user32.dll只支持win32
import tkinter as tk
import pygame as pg
import os
root = tk.Tk()
os.environ["SDL_WINDOWID"] = str(root.winfo_id())
screen = pg.display.set_mode((400,300))#pg窗口大小
root.geometry("400x300")#tk窗口大小
2.输入框
直接place可以,但由于pg太"慢",会出现打"abcdefg"出现"abdeg"等情况,遂使用threading,tk不可以在线程中更新,只能在thread中更新pg
import threading
def mainloop():
"pygame mainloop"
while 1:
for e in pg.event.get():
#some handle
pass
pg.display.update()
threading.Thread(target=mainloop,daemon=1).start()
必须守护线程
3.构建Entry
须注意entry的颜色
en = tk.Entry(font="SimHei 25",width=10,bg="black",fg="white",borderwidth=1,insertbackground="white",highlightbackground="white",relief="ridge")
en.place(x=200,y=0)
参数意思可以自己研究一下,在此省略
4.左右及backspace
这会被pg覆盖掉,这样:
if e.type == pg.KEYDOWN:
if e.key == 8:
en.event_generate("<KeyPress>",keycode=e.key)
en.event_generate("<KeyPress>",keycode=e.key)
elif e.key == pg.K_LEFT:
en.event_generate("<KeyPress-Left>")
elif e.key == pg.K_RIGHT:
en.event_generate("<KeyPress-Right>")
栗子
import tkinter as tk
import pygame as pg
import threading
import os,sys,time
def mainloop():
while 1:
screen.fill((0,0,0))
screen.blit(font.render("请输入姓名:",1,(255,255,255)),(0,0))
for e in pg.event.get():
if e.type == pg.QUIT:
#this is not a way
pass
elif e.type == pg.KEYDOWN:
if e.key == 8:
en.event_generate("<KeyPress>",keycode=e.key)
en.event_generate("<KeyPress>",keycode=e.key)
elif e.key == pg.K_LEFT:
en.event_generate("<KeyPress-Left>")
elif e.key == pg.K_RIGHT:
en.event_generate("<KeyPress-Right>")
screen.blit(font.render("名称:"+en.get(),1,(255,255,255)),(0,100))
pg.display.update()
clock.tick(30)
root = tk.Tk()
os.environ["SDL_WINDOWID"] = str(root.winfo_id())
en = tk.Entry(font="SimHei 25",width=10,bg="black",fg="white",borderwidth=1,insertbackground="white",highlightbackground="white",relief="ridge")
en.place(x=200,y=0)
root.geometry("400x300")
pg.init()
screen = pg.display.set_mode((400,300))
font = pg.font.SysFont("SimHei",30)
clock = pg.time.Clock()
threading.Thread(target=mainloop,daemon=1).start()
root.mainloop()
写在最后
须注意:1.title由tk窗口决定 2.pygame.QUIT将不起作用,可以用root.protocol
解决
本文章发布于CSDN在2021.12.18 12:17
不要吝啬你的赞!
以上是关于[Pygame&tkinter]真·中文输入框的主要内容,如果未能解决你的问题,请参考以下文章
我无法将我的 pygame 游戏链接到我的 tkinter GUI
python怎么安装第三方库,python国内镜像源,终于找到最全的安装教程啦;如Requests,Scrapy,NumPy,matplotlib,Pygame,Pyglet,Tkinter