python - Tkinter 类方法和访问类成员

标签 python tkinter

在尝试使用复合 tkinter 小部件制作编辑器时,我偶然发现了错误或错误? MyTextWidget 类中定义的方法:fl() 和 fh() 用于设置属于同一类的文本小部件的字体大小。

我的理解是这应该可行,但是当我使用 create_window() 方法在 Canvas 上拥有同一个 MyTextWidget 类的三个实例时,在按下 fl 按钮和 fh 按钮后,所有三个文本小部件中的文本大小会同时发生变化。我首先用一个小部件对其进行了测试,当一切都令我满意时,我又添加了两个相同类的实例,但现在它并没有像我预期的那样工作。

如果这有帮助,版本是 Python 2.7,Tkinter 版本是 Revision: 81008, debian linux。

非常感谢您的帮助,特别是如果您可以指导我阅读对相关信息有帮助的书籍或文档。请指教。

import Tkinter as tk
import tkFont

class MyTextWidget(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent)


        self.text = tk.Text(self, *args, **kwargs)
        self.tbar = tk.Frame(self, *args, **kwargs)
        self.tbar.pack(side=tk.TOP, padx=2, pady=2, fill="x", expand=True)
        self.fl = tk.Button(self.tbar)
        self.fl.pack(side=tk.LEFT, padx=2, pady=2)
        self.fh = tk.Button(self.tbar, *args, **kwargs)
        self.fh.pack(side=tk.LEFT, padx=2, pady=2)
        def fl():
            print "fl called"
            self.text.configure(font=tkFont.Font(family="mytsmc", size=7), spacing1=2,spacing2=22,spacing3=2)
        def fh():
            print "fh called"
            self.text.configure(font=tkFont.Font(family="mytsmc", size=9), spacing1=2,spacing2=22,spacing3=2)

        self.fl.config(text="fl", width=1, command=fl)
        self.fh.config(text="fh", width=1, command=fh)

        self.vsb = tk.Scrollbar(self, orient="vertical", command=self.text.yview)
        self.text.configure(yscrollcommand=self.vsb.set,
                            font=tkFont.Font(family="mytsmc", size=8),
                            spacing1=2,spacing2=32,spacing3=2)
        self.vsb.pack(side="right", fill="y")
        # self.text.pack(side="left", fill="both", expand=True)
        self.text.pack(side="left", fill="both", expand=False)

        self.insert = self.text.insert
        self.delete = self.text.delete
        self.mark_set = self.text.mark_set
        self.get = self.text.get
        self.index = self.text.index
        self.search = self.text.search


class myEditor(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)
        self.w = tk.Canvas(self, width=1320,
                 height=740,
                 borderwidth=1,
                 background='white',
                 relief='raised')
        self.w.pack(anchor='center')
        #One
        self.scrolled_text1 = MyTextWidget(self)
        self.firstwidget = self.w.create_window(10, 10,
                                                anchor=tk.NW,
                                                width=400,
                                                height=400,
                                                window=self.scrolled_text1)
        with open("/home/username/datafiles/1.txt", "r") as f:
            self.scrolled_text1.insert("1.0", f.read())
        #Two
        self.scrolled_text2 = MyTextWidget(self)
        self.firstwidget = self.w.create_window(420, 10,
                                                anchor=tk.NW,
                                                width=400,
                                                height=400,
                                                window=self.scrolled_text2)
        with open("/home/username/datafiles/2.txt", "r") as f:
            self.scrolled_text2.insert("1.0", f.read())
        #Three
        self.scrolled_text3 = MyTextWidget(self)
        self.firstwidget = self.w.create_window(830, 10,
                                                anchor=tk.NW,
                                                width=400,
                                                height=400,
                                                window=self.scrolled_text3)
        with open("/home/username/datafiles/3.txt", "r") as f:
            self.scrolled_text3.insert("1.0", f.read())

        def switchtob(event=None):
            self.scrolled_text1.text.focus()
            print "switched to b"
        def switchton(event=None):
            self.scrolled_text2.text.focus()
            print "switched to n"
        def switchtom(event=None):
            self.scrolled_text3.text.focus()
            print "switched to m"
        root.bind('<Control-b>',switchtob)
        root.bind('<Control-n>',switchton)
        root.bind('<Control-m>',switchtom)

root = tk.Tk()
myEditor(root).pack(side="top", fill="both", expand=True)
def exit(event=None):
    quit()
root.bind('<Control-q>',exit)

root.mainloop()

最佳答案

简单的解决方法是创建一次字体,保存对它们的引用,然后使用它们而不是每次单击按钮时都实例化新字体。

class MyTextWidget(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        ...
        self.font1 = tkFont.Font(family="mytsmc", size=7)
        self.font2 = tkFont.Font(family="mytsmc", size=9)
        ...
        def fl():
            self.text.configure(font=self.font1, spacing1=2,spacing2=22,spacing3=2)
        def fh():
            self.text.configure(font=self.font2, spacing1=2,spacing2=22,spacing3=2)

关于python - Tkinter 类方法和访问类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41987062/

相关文章:

python - 将 python datetime 对象格式化为参数

Python MySQLdb - 获取 ValueError

python - 如何使用 python3 创建虚拟环境

python - Django celery - 在前一个实例完成的设定持续时间后启动周期性任务

python - 选择 tkinter 时按钮会立即改变颜色

python - 删除 Ttk Notebook 选项卡虚线

python - 使用十进制数据类型无法在 1076 位数字后打印

python-3.x - Tkinter视频的闪烁视频

python - matplotlib 错误 - 没有名为 tkinter 的模块

python-3.x - 将数字转换为 tkinter 颜色