V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
0clickjacking0
V2EX  ›  Python

关于 Python3 tkinter 的一个问题

  •  
  •   0clickjacking0 · 2019-07-07 16:38:13 +08:00 · 2452 次点击
    这是一个创建于 1966 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    我的代码如下

    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 条附言  ·  2019-07-07 18:18:03 +08:00

    实现代码如下

    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
    guiqiqi
        1
    guiqiqi  
       2019-07-07 17:43:36 +08:00 via iPhone
    我记得 tkinter 好像是没有 entry 的 textchanged 事件,提供一个蠢思路:
    把键盘的全部按键都监听一下,回调到同一个函数;用回调函数更新 stringvar 的值,这样大体能够实现。
    0clickjacking0
        2
    0clickjacking0  
    OP
       2019-07-07 18:17:25 +08:00
    @guiqiqi 谢谢你!!我已经解决了,感谢提供思路
    leavic
        3
    leavic  
       2019-07-07 18:55:09 +08:00
    早日放弃 tkinter,改用 pyqt
    guiqiqi
        4
    guiqiqi  
       2019-07-07 18:58:44 +08:00 via iPhone
    @leavic tk 写一些小工具还是很方便的,而且毕竟开箱即用,打包体积比 qt 也小一些,个人觉得还是不错的。
    Cooky
        5
    Cooky  
       2019-07-07 19:05:08 +08:00
    tkinter 查个资料太费劲
    limyel
        6
    limyel  
       2019-07-08 09:38:45 +08:00
    您怎么解决的呀,用多线程吗
    0clickjacking0
        7
    0clickjacking0  
    OP
       2019-07-08 12:06:06 +08:00
    @limyel 代码贴在上面了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2843 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:58 · PVG 16:58 · LAX 00:58 · JFK 03:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.