首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

关于 Python3 tkinter 的一个问题

  •  
  •   0clickjacking0 · 12 天前 · 822 次点击

    我想做一个编码进制转换器,但是遇到了一些问题。就是我想在输入文字之后,立刻输出解码或者编码后的内容,就是输入与输出同步

    我的代码如下

    e = tk.Entry(self.initface)
    e.pack()
    def go(*args):  # 处理事件,*args 表示可变参数
        # e.delete(0, 'END')
        # URL 解码
        if comboxlist.get() == 'URL':
            var = e.get()
            t.insert('end',unquote(var))
        # base64 解码
        if comboxlist.get() == 'Base64':
            var = e.get()
            t.insert('end',base64.b16decode(var))
        # 将转换成 16 进制
        if comboxlist.get() == 'Hex':
            var = e.get()
            t.delete(1.0,'end')
            t.insert('end',hex(int(var)))
        # 将转换成 8 进制
        if comboxlist.get() == 'Octal':
            var = e.get()
            t.insert('end',oct(var))
        # 将转换成 2 进制
        if comboxlist.get() == 'Binary':
            var = e.get()
            t.insert('end',bin(var))
    comvalue = tk.StringVar()  # 窗体自带的文本,新建一个值
    comboxlist = ttk.Combobox(self.initface, textvariable=comvalue, state='readonly')  # 初始化
    comboxlist["values"] = ('Decode as', "URL", "Base64", "Hex", "Octal",'Binary')
    comboxlist.current(0)  # 选择第一个
    comboxlist.bind("<<ComboboxSelected>>", go)  # 绑定事件,(下拉列表框被选中时,绑定 go()函数)
    comboxlist.pack()
    t = tk.Text(self.initface,height = 4)
    t.pack()
    

    类似这样的,但这个是 java 的代码

    请问各位师傅该如何做到这样的效果

    第 1 条附言  ·  12 天前

    实现代码如下

    import tkinter as tk
    
    def callback(sv):
        t.delete(1.0, 'end')
        t.insert('end',sv.get())
    
    root = tk.Tk()
    sv = tk.StringVar()
    sv.trace("w", lambda name, index, mode, sv=sv: callback(sv))
    e = tk.Entry(root, textvariable=sv)
    e.pack()
    t = tk.Text(root,height = 3)
    t.pack()
    root.mainloop()
    
    7 回复  |  直到 2019-07-08 12:06:06 +08:00
        1
    guiqiqi   12 天前 via iPhone
    我记得 tkinter 好像是没有 entry 的 textchanged 事件,提供一个蠢思路:
    把键盘的全部按键都监听一下,回调到同一个函数;用回调函数更新 stringvar 的值,这样大体能够实现。
        2
    0clickjacking0   12 天前
    @guiqiqi 谢谢你!!我已经解决了,感谢提供思路
        3
    leavic   12 天前
    早日放弃 tkinter,改用 pyqt
        4
    guiqiqi   12 天前 via iPhone
    @leavic tk 写一些小工具还是很方便的,而且毕竟开箱即用,打包体积比 qt 也小一些,个人觉得还是不错的。
        5
    Cooky   12 天前
    tkinter 查个资料太费劲
        6
    limyel   11 天前
    您怎么解决的呀,用多线程吗
        7
    0clickjacking0   11 天前
    @limyel 代码贴在上面了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1700 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 16:31 · PVG 00:31 · LAX 09:31 · JFK 12:31
    ♥ Do have faith in what you're doing.