2015-05-18 48 views
3

我有一個tk.Text類,它的高度(不是它的寬度,由父級決定)與它的文本數量相符。它適用於文本的一個實例,但不是多個文本 - 看起來self.resize函數不再在第一個文本框中調用。這可能是因爲我還沒有完全理解tkinter中的bindtags概念。任何幫助,將不勝感激。謝謝。tkinter.Text符合文本大小不適用於多個實例

import tkinter as tk 

class ResizedText(tk.Text): 
    def __init__(self, parent, *args, **kwargs): 
     self.parent = parent 
     self.container_container = tk.Frame(parent, bg="blue") 
     self.container = tk.Frame(self.container_container, bg="red") 
     super().__init__(self.container, *args, **kwargs) 
     bindtags = list(self.bindtags()) 
     bindtags.insert(0, "custom") 
     self.bindtags(tuple(bindtags)) 
     self.bind_class("custom", "<KeyRelease>", self.resize) 
     self.container_container.bind("<Configure>", self.resize) 
    def grid(self, *args, **kwargs): 
     self.container_container.grid(*args, **kwargs) 
     self.container.grid(row=0, column=0) 
     self.container.grid_propagate(False) 
     super().grid(row=0, column=0, sticky="nsew") 
     self.container.grid_columnconfigure(0, weight=1) 
    def resize(self, event=None): 
     self.container.config(width=self.container_container.winfo_width()) 
     if self.bbox("end-1c"): 
      text_height = (self.bbox("end-1c")[1]+self.bbox("end-1c")[3])+4 
      if text_height < 20: text_height = 20 
     else: text_height = 20 
     self.container.config(height=text_height) 

GUI = tk.Tk() 
f = ResizedText(GUI, wrap="word") 
f.grid(row=0, column=0, sticky="ew") 
g = ResizedText(GUI, wrap="word") 
g.grid(row=1, column=0, sticky="ew") 
GUI.grid_columnconfigure(0, weight=1) 

回答

1

您正在創建一個綁定標籤(「自定義」),並試圖爲每個窗口綁定一個唯一綁定。實際上,您每次撥打self.bind_class("custom", ...)時,您都會重新定義的綁定。這是因爲該標籤是共享資源,並且它只能有一個綁定。

因爲您的綁定與實例緊密耦合,所以最後創建的任何小部件都是無論何時發生任何帶有該標記的小部件的事件時都會調用的小部件。

您需要:

  1. 綁定到綁定標籤一次,並將它調用可以找出哪個窗口的事件是某個函數(例如:也許它可以使用event.widget而不是self)或
  2. 爲每個小部件創建一個自定義綁定標記,以便每個綁定都是唯一的。

這不是真的,但是對於所有意圖和目的來說都是如此。要描述爲什麼它不會需要很長的答案,並且它不會讓你更接近你的目標。

+0

我想在_class_到''中創建一個綁定,但我還必須有一個到_instance_的外部綁定,也有''。這是否意味着我仍然需要製作自定義綁定標籤? – claust

+0

@claust:我不確定如何在一個小小的評論框中回答這個問題。如果您要將事件綁定到特定的實例(問題中的代碼正在做什麼),那麼您需要爲每個實例定製一個綁定標記。如果您的綁定函數可以被重寫爲使用'event.widget'而不是'self',那麼您只需要綁定到類方法或全局函數的單個綁定標籤。 –

相關問題