如果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()
答案 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()