没有错误但没有工作,文本更改Tkinter时运行功能

时间:2017-05-31 14:19:49

标签: python tkinter

如果mywidget条目发生更改,则应运行函数atado_enter。如果我在这个函数中添加了一些错误,它会给我错误信息,但如果我想做某事它严格什么也不做。有人能解释我的错吗?

#!usr/bin/python
#-*- coding: utf-8 -*-

import os
import time
import mysql.connector
import getpass
import smtplib
from email.mime.text import MIMEText
global atado_kartya_szam
global atvevo_kartya_szam
from PIL import Image, ImageTk
#from Tkinter import Tk, Text, TOP, BOTH, X, N, LEFT
from Tkinter import * 
from Tkinter import Tk as tk
from ttk import Frame, Style, Entry, Label

class Example(Frame):

    def __init__(self, parent):     
        Frame.__init__(self, parent)        
        self.parent = parent
        self.initUI()

    def initUI(self):
        def atado_enter(*args): 
            print("vmi")

        self.parent.title("Pozi")
        self.pack(fill = BOTH, expand=True)

        frame1 = Frame(self)
        frame1.pack(fill=X)

        lbl1 = Label(frame1, text = "ĂtadĂł kártyája", width = 15)
        lbl1.pack(side = LEFT, padx=5, expand=True)

        myvar = StringVar()
        myvar.set('')
        mywidget = Entry(frame1,textvariable=myvar,width=10)
        mywidget.pack()
        myvar.trace('w',atado_enter)

def main():

    root = Tk()
    root.geometry("550x450+300+300") # width x heigth + x + y (on screen)
    app = Example(root)
    root.mainloop()  


if __name__ == '__main__':
    main()  

2 个答案:

答案 0 :(得分:4)

initUI完成执行后,myvar会收集垃圾,因为没有更多的生命引用。收集垃圾的StringVar不会触发任何回调。

尝试保持对该对象的更长寿命的引用。最简单的方法是将其分配给属性self

    #... rest of function goes here...
    myvar = StringVar()
    myvar.set('')
    mywidget = Entry(frame1,textvariable=myvar,width=10)
    mywidget.pack()
    myvar.trace('w',atado_enter)
    self.myvar = myvar

答案 1 :(得分:1)

首先。我认为你的tkinter进口存在问题。

改变这个:

from Tkinter import * 
from Tkinter import Tk as tk
from ttk import Frame, Style, Entry, Label

对此:

from Tkinter import *

看到已经有使用trace的答案并且我的答案缺乏,我决定通过检查200毫秒来查看值是否已更改来添加一个有趣的替代方案。此数字可以更改为任何ms。它可能不像跟踪那么简单,但确实有效。

我删除了跟踪并创建了一个函数/方法,用于检查mywidget是否已更改,如果为true,则调用atado_entry

last_mywidget = [""]
def CheckMywidget():
    if last_mywidget != [mywidget.get()]:
        atado_enter(mywidget.get())
        last_mywidget[0] = mywidget.get()
        print(last_mywidget)
        mywidget.after(200, CheckMywidget)
    else:
        mywidget.after(200, CheckMywidget)
CheckMywidget()

以下是完整的代码:

class Example(Frame):

    def __init__(self, parent):     
        Frame.__init__(self, parent)        
        self.parent = parent
        self.initUI()

    def initUI(self):
        def atado_enter(*args): 
            print("vmi")

        self.parent.title("Pozi")
        self.pack(fill = BOTH, expand=True)

        frame1 = Frame(self)
        frame1.pack(fill=X)

        lbl1 = Label(frame1, text = "ĂtadĂł kártyája", width = 15)
        lbl1.pack(side = LEFT, padx=5, expand=True)

        myvar = StringVar()
        myvar.set('')
        mywidget = Entry(frame1,textvariable=myvar,width=10)
        mywidget.pack()
        #myvar.trace("w", atado_enter)
        self.myvar = myvar

        last_mywidget = [""]
        def CheckMywidget():
            if last_mywidget != [mywidget.get()]:
                atado_enter(mywidget.get())
                last_mywidget[0] = mywidget.get()
                mywidget.after(200, CheckMywidget)
            else:
                mywidget.after(200, CheckMywidget)
        CheckMywidget()

def main():

    root = Tk()
    root.geometry("550x450+300+300") # width x heigth + x + y (on screen)
    app = Example(root)
    root.mainloop()  


if __name__ == '__main__':
    main()