码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • tkwebview2使用tkinter输入框失效的解决方法


    tkwebview2使用tkinter输入框失效的解决方法

    • 引言
    • 解决思路
    • 解决方法
    • 具体解决
    • 效果
    • 结语

    引言

    在使用TinUI编写轻型浏览器中,我们使用我的tkwebview2作为网页控件,搭建了一个轻型浏览器。

    在使用中,一定会发现,输入框在我们点击任意一个WebView2控件后都会失效,也就是无法再一次获取输入。需要让整个窗口失去焦点,才能再次激活tkinter输入框。

    这种情况很麻烦,但是最近我找到了解决办法——以毒攻毒,直接将WinForms的TextBox控件“tkinter化”,替代tkinter输入框。

    测试文件——tkwebview2/001.py at main · Smart-Space/tkwebview2 · GitHub。


    解决思路

    其实通过测试,我们可以发现在点击webview2控件后,输入框不能直接点击输入内容。

    这个示例在早期的tkwebview2/001.py中。

    发现以下信息:

    1. 在tkinter单独使用若干个WinForms控件,不会造成WinForms输入框失效。

      我们不需要在同一个Frame里面添加多个WinForms控件,我们仅需要分别将WinForms控件转为tkinter控件使用就可以了。

    2. 点击TextBox控件之后,tkinter输入框也失效

      不单单是WebView2的问题,而是全部winforms控件的问题。


    解决方法

    很简单,就是用TextBox代替Entry控件。接下来就是两种方法:

    1. 将Entry作为父组件,填充布局(字号字体一致,通过TextBox.Font设置)

    2. 覆盖Entry布局(字号字体一致)

    将TextBox转为tkinter控件代码:

    def tofont(name:str,size:int):
        return Font(String(name),Single(size))
    
    
    #tkinter化winforms的textbox
    class tkTextBox(Frame):
    
        def __init__(self,master,width=400,height=20):
            Frame.__init__(self,master,width=width,height=height)
            font=tofont('微软雅黑',14)
            self.tb=TextBox()
            self.ehwnd=int(str(self.tb.Handle))
            user32.SetParent(self.ehwnd,self.winfo_id())
            user32.MoveWindow(self.ehwnd,0,0,width,height,True)
            self.tb.Font=font
            self.bind('',self.__resize)
    
        def __resize(self,event):
            self.tb.Width=self.winfo_width()
            self.tb.Height=self.winfo_height()
    
        def get(self):
            return self.tb.Text
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    tofont函数是将python中的字体字号转化为WinForms控件可用的Font类

    如果需要改动字体,则使用如下代码:

    tktextbox.tb.Font=tofont('font-name',size)
    
    • 1

    具体解决

    上面提出了解决方法,那么具体情况呢?接下来以开头提到文章里面的代码做示例。

    主要改动的地方,就是在newpage函数中,使用tkTextBox覆盖。

    def newpage(title='新标签页',url='https://bing.com/'):
        #...
        __urlenter,uid = nx.tags["urlenter"]
        bbox=nu.bbox(uid)
        urlenter=tkTextBox(nu)
        nu.create_window((bbox[0],bbox[1]),window=urlenter,anchor='nw',
                         width=bbox[2]-bbox[0],height=bbox[3]-bbox[1])
        urlenter.tb.KeyDown+=lambda s,a:newurl(s,a,webview)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    重写newurl函数。

    def newurl(s,e,wb):
        if e.KeyCode==Keys.Enter:
            url=s.Text
            if url!='':
                wb.load_url(url)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    效果

    在这里插入图片描述


    结语

    到这里,tkinter中使用winforms控件导致输入框失效的问题就解决了。

    🔆tkinter创新🔆

    【笔记】

  • 相关阅读:
    【面试篇】地平线深度学习模型算法开发一面
    C++-Cmake指令:install【用于指定在安装时运行的规则;这里的“安装”,install这个说法,倒觉得有点不是很准确,倒是和复制比较类似】
    MQ - 38 Serverless : 基于Serverless架构实现流式数据处理
    MockJs
    【项目】实现一个mini的tcmalloc(高并发内存池)
    文件包含漏洞(1),文件包含漏洞的利用原理
    10-css宽高自适应&伪元素
    Nginx ngx_http_auth_request_module模块鉴权【下】携带账号密码登录
    GPU服务器环境搭建
    小黑准备收拾东西领物资的日常积累:线程与进程
  • 原文地址:https://blog.csdn.net/tinga_kilin/article/details/126136902
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号