2017-09-06 30 views
-2

一個如何自動調整文本控件,以適應文本控件的高度自動調整文本組件的高度,以適合所有文本

  • 不會有任何\n OM文本組件,而不是文本將換行(全字)周圍並繼續下去。 wrap=WORD

這怎麼辦?

我快到問題陳述的想法:我想知道是否有可能每一個文本在文本組件纏時間來算,並通過給定值不知何故計算文本組件的高度? - 只是一個想法..我不知道是否有可能。

**爲什麼這是不是重複**

這不是重複,鏈接到你要求它,如果你認爲這樣的重複問題。他們都實現了一個解決方案,在該解決方案中,它在文本小部件的每個按鍵中檢查'\ n'。我的文本小部件根本沒有任何'\ n'。但是將這些詞包裹起來!

這不是我正在尋找的解決方案,因爲它正在尋找'\ n'並相應地改變它的高度以找到它們的數量。由於我不會使用任何'\ n',而是將這些字詞包裝起來(Text(frame, wrap=WORDS)),否則'n不會出現使該解決方案無法使用!'

這就是爲什麼此代碼來自問題人聲明這就是,無須改正這個問題重複,這不是重複

不會解決我的問題,因爲它會查找「\ n」的。

import Tkinter 

class TkExample(Tkinter.Frame): 
    def __init__(self, parent): 
     Tkinter.Frame.__init__(self, parent) 
     self.init_ui() 

    def init_ui(self): 
     self.pack() 
     text_box = Tkinter.Text(self) 
     text_box.pack() 
     text_box.bind("<Key>", self.update_size) 

    def update_size(self, event): 
     widget_width = 0 
     widget_height = float(event.widget.index(Tkinter.END)) 
     for line in event.widget.get("1.0", Tkinter.END).split("\n"): 
     if len(line) > widget_width: 
      widget_width = len(line)+1 
     event.widget.config(width=widget_width, height=widget_height) 

if __name__ == '__main__': 
    root = Tkinter.Tk() 
    TkExample(root) 
    root.mainloop() 

編輯例如

這是reas爲什麼我不使用消息小部件,他們不重新排列文本以填充文本小部件。

enter image description here

+0

這不是重複的,如果您認爲如此,您聲稱它是重複的問題的鏈接。他們都實現了一個解決方案,在該解決方案中,它在文本小部件的每個按鍵中檢查'\ n'。我的文本小部件根本沒有任何'\ n'。但是將這些詞包裹起來! – Bjango

+0

是不是有沒有使用標籤或消息小部件的原因?你需要用戶編輯文本的能力嗎? –

+0

我沒有使用消息窗口小部件,因爲它們不會重新排列文本以填充窗口小部件的水平視圖,正如您在「編輯示例」中所看到的,我剛更新了我的問題。我不使用標籤的原因應該很清楚。 – Bjango

回答

1

的Tkinter的文本組件的目的不是要增加或縮小以適合像一個標籤控件的內容。如果您只需要顯示純文本而無需交互編輯更多文本,則Label可能是比Text更好的選擇。也就是說,可以在文本小部件中獲取顯示的行數,並且可以通過該信息調整小部件的大小。

下面是一個示例,演示如何在編程插入文本時使其調整大小。它不會處理您鍵入時的大小調整,儘管可以這樣做。

訣竅是要知道文本小部件內部有一個count方法,您可以調用該方法來獲取顯示的行數。不幸的是,這種方法沒有暴露在tkinter層,因此需要了解tkinter如何在內部工作的知識。

class ExpandoText(tk.Text): 
    def insert(self, *args, **kwargs): 
     result = tk.Text.insert(self, *args, **kwargs) 
     self.reset_height() 
     return result 

    def reset_height(self): 
     height = self.tk.call((self._w, "count", "-update", "-displaylines", "1.0", "end")) 
     self.configure(height=height) 

下面是如何使用它的一個例子:

root = tk.Tk() 
text = ExpandoText(root, width=20, wrap="word") 
text.pack(fill="both", expand=True) 

root.update_idletasks() 
text.insert("1.0", "This is a line of text that will initially be wrapped.") 

root.after(5000, text.insert, "end", "This is more text") 

root.mainloop() 

當您運行的代碼,你應該會看到這樣的窗口:

original screenshot

如果您不需要手動調整窗口大小,並等待5秒鐘,窗口將顯示添加的文字:

screenshot with more text

不幸的是,您必須在插入之前調用update_idletasks,以便tkinter知道窗口實際上有多寬。這可能會產生視覺副作用,具體取決於代碼其餘部分的工作方式(請參閱:您可能會在用戶界面第一次啓動時看到閃光燈)。

+0

非常好!你在哪裏閱讀/瞭解這種計數方法(通常是內部的東西)。我引用@nbro的話:「據我所知,tk.call()沒有官方文檔。」我之所以問這個問題,是因爲我想了解更多關於這個主題的內容,以便在我的代碼中正確實施它。 quote from:https://stackoverflow.com/a/28645458/7770313 – Bjango

+0

'count'方法記錄在官方tk文檔中:http://tcl.tk/man/tcl8.5/TkCmd/text.htm #M72,以及通過檢查tkinter源代碼學習的'call'方法。 –

相關問題