无错误但不工作,文本更改时运行函数

2024-04-29 12:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

如果mywidget条目发生更改,它应该运行函数atado_enter。如果我在这个函数中输入了一些错误,它会给我error msg,但是如果我想做一些事情,它严格来说什么也不做。有人能解释一下有什么问题吗?你知道吗

#!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()  

Tags: fromimportselftkinterdefrootframepack
2条回答

首先。我想你们的进口产品有问题。你知道吗

更改此项:

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

对此:

from Tkinter import *

看到已经有了一个使用trace的答案,而我的答案却没有,我决定添加一个有趣的替代方法,每200毫秒检查一次,看看这个值是否发生了变化。这个数字可以更改为任何ms。它可能不像trace那么简单,但确实有效。你知道吗

我删除了跟踪并创建了一个函数/方法,该函数/方法将检查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()  

一旦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

相关问题 更多 >