[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 窗口?

将按键发送到嵌入式 Pygame

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

Tkinter 嵌入图形子进程

在 Tkinter 中使用 Spritesheets

python怎么安装第三方库,python国内镜像源,终于找到最全的安装教程啦;如Requests,Scrapy,NumPy,matplotlib,Pygame,Pyglet,Tkinter