tkinter回调异常_Python tkinter文本修改后的回调

在python 2.7中,每次在Tkinter Text小部件中更改某些内容时,我都会尝试进行回调.

这两个代码分别工作正常,但将这两个代码组合起来对我来说很难.

这是我尽可能使用裸代码的尝试.

import Tkinter as tk

class Texter(tk.Tk):

def __init__(self, *args, **kwargs):

tk.Tk.__init__(self, *args, **kwargs)

container = tk.Frame(self)

container.pack()

self.frames = {}

for F in (ConnectPage, EditorPage):

frame = F(container, self)

self.frames[F] = frame

frame.grid(row=0, column=0, sticky="nsew")

page_name = EditorPage.__name__

self.frames[page_name] = frame

self.show_frame(ConnectPage)

def show_frame(self, cont):

frame = self.frames[cont]

frame.tkraise()

def get_page(self, page_name):

return self.frames[page_name]

class ConnectPage(tk.Frame):

def __init__(self, parent, controller):

tk.Frame.__init__(self, parent)

button1 = tk.Button(self, text="SecondPage",

command=lambda: controller.show_frame(EditorPage))

button1.grid(row=2, column=3, padx=15)

class EditorPage(tk.Frame):

def __init__(self, parent, controller):

tk.Frame.__init__(self, parent)

self.text = tk.Text(self, height=25, width=80)

self.text.grid(column=0, row=0, sticky="nw")

button2 = tk.Button(self, text="FirstPage",

command=lambda: controller.show_frame(ConnectPage))

button2.grid(row=2, column=3, padx=15)

self.clearModifiedFlag()

self.bind_all('<>', self._beenModified)

def _beenModified(self, event=None):

if self._resetting_modified_flag: return

self.clearModifiedFlag()

print("Hello!")

#self.beenModified(event)

def clearModifiedFlag(self):

self._resetting_modified_flag = True

try:

self.tk.call(self._w, 'edit', 'modified', 0)

finally:

self._resetting_modified_flag = False

if __name__ == '__main__':

gui = Texter()

gui.mainloop()

我尝试从回调示例中仅获取必要的部分.

代码确实进行了回调(如果修改了文本时self.tk.call(self._w,’edit’,’modified’,0)行被注释掉),但重置修改后的标志不起作用,所以只第一个修改已注册.

目前我收到以下错误:

第67行,在clearModifiedFlag中

????self.tk.call(self._w,’edit’,’modified’,0)

_tkinter.TclError:错误选项“编辑”:必须是cget或configure

在回调示例代码中,“编辑”工作正常.

编辑:这是工作代码

import Tkinter as tk

class Texter(tk.Tk):

def __init__(self, *args, **kwargs):

tk.Tk.__init__(self, *args, **kwargs)

container = tk.Frame(self)

container.pack()

self.frames = {}

for F in (ConnectPage, EditorPage):

frame = F(container, self)

self.frames[F] = frame

frame.grid(row=0, column=0, sticky="nsew")

page_name = EditorPage.__name__

self.frames[page_name] = frame

self.show_frame(ConnectPage)

def show_frame(self, cont):

frame = self.frames[cont]

frame.tkraise()

def get_page(self, page_name):

return self.frames[page_name]

class ConnectPage(tk.Frame):

def __init__(self, parent, controller):

tk.Frame.__init__(self, parent)

button1 = tk.Button(self, text="SecondPage",

command=lambda: controller.show_frame(EditorPage))

button1.grid(row=2, column=3, padx=15)

class EditorPage(tk.Frame):

def __init__(self, parent, controller):

tk.Frame.__init__(self, parent)

self.text = CustomText(self, height=25, width=80)

self.text.grid(column=0, row=0, sticky="nw")

self.text.bind("<>", self.onModification)

button2 = tk.Button(self, text="FirstPage",

command=lambda: controller.show_frame(ConnectPage))

button2.grid(row=2, column=3, padx=15)

def onModification(self, event):

print("Yellow!")

class CustomText(tk.Text):

def __init__(self, *args, **kwargs):

"""A text widget that report on internal widget commands"""

tk.Text.__init__(self, *args, **kwargs)

# create a proxy for the underlying widget

self._orig = self._w + "_orig"

self.tk.call("rename", self._w, self._orig)

self.tk.createcommand(self._w, self._proxy)

def _proxy(self, command, *args):

cmd = (self._orig, command) + args

result = self.tk.call(cmd)

if command in ("insert", "delete", "replace"):

self.event_generate("<>")

return result

if __name__ == '__main__':

gui = Texter()

gui.mainloop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值