قم بإنشاء ملصقات ttkinter/ttk قابلة للتشكيل/multiline مع Word Wrap

StackOverflow https://stackoverflow.com/questions/4011354

  •  25-09-2019
  •  | 
  •  

سؤال

هل من الممكن إنشاء ملصق متعدد الخطوط مع Word Wrap يتم تغيير حجمه مع عرض والديه؟ وبعبارة أخرى ، فإن سلوك WordWrap من المفكرة أثناء تغيير عرض نافذة المفكرة.

حالة الاستخدام عبارة عن مربع حوار يحتاج إلى تقديم كتلة من النص متعدد الخطوط (التعليمات) بالكامل دون أن يتم قطع النص أو اللجوء إلى أشرطة التمرير. سيكون للحاوية الأصل مساحة عمودية كافية لاستيعاب العروض الضيقة.

لقد قمت بتجربة TKinter Label and Message Widgets و TTK Label Widget دون نجاح. يبدو أنني بحاجة إلى رمز صلبة قيمة طول البكسل مقابل وجود عناصر التحكم هذه في WordWrap عندما يصل نصها إلى الحافة اليمنى لحاوياتها. من المؤكد أن مديري Geometry Tkinters يمكنهم مساعدتي في تحديد تسمياتي تلقائيًا وتحديث قيم الطول الخاصة بهم وفقًا لذلك؟

هل يجب أن أنظر إلى عنصر واجهة المستخدم بدلاً من ذلك؟ إذا كان الأمر كذلك ، فهل من الممكن إخفاء حدود عنصر واجهة مستخدم نصية حتى أتمكن من استخدامها كعلامة متعددة الخطوط مع WordWrap؟

إليك نموذجًا أوليًا لكيفية قيام المرء بما وصفته أعلاه. كانت مستوحاة من نصيحة برايان أوكلي لاستخدام عنصر واجهة المستخدم والنشر التالي على Stackoverflow:في Python's tkinter ، كيف يمكنني صنع تسمية بحيث يمكنك تحديد النص مع الماوس؟

from Tkinter import *
master = Tk()

text = """
If tkinter is 8.5 or above you'll want the selection background to appear like it does when the widget is activated. Comment this out for older versions of Tkinter.

This is even more text.

The final line of our auto-wrapping label that supports clipboard copy.
""".strip()

frameLabel = Frame( master, padx=20, pady=20 )
frameLabel.pack()
w = Text( frameLabel, wrap='word', font='Arial 12 italic' )
w.insert( 1.0, text )
w.pack()

# - have selection background appear like it does when the widget is activated (Tkinter 8.5+)
# - have label background color match its parent background color via .cget('bg')
# - set relief='flat' to hide Text control borders
# - set state='disabled' to block changes to text (while still allowing selection/clipboard copy)
w.configure( bg=master.cget('bg'), relief='flat', state='disabled' )

mainloop()
هل كانت مفيدة؟

المحلول

لا ، لا توجد ميزة مدمجة في TK إلى ملصقات WORD-WORD. ومع ذلك ، فإنه يمكن القيام به من خلال الارتباط بـ <Configure> حدث التسمية وضبط طول الالتفاف بعد ذلك. سيتم إطلاق هذا الربط في كل مرة يتم فيها تغيير حجم عنصر واجهة المستخدم.

الخيار الآخر ، كما تقترح ، هو استخدام أداة نصية. من الممكن إيقاف تشغيل الحدود تمامًا إذا كنت ترغب في ذلك. لقد كان هذا دائمًا خياري عندما أريد نصًا تعليميًا ملفوفًا بالكلمة.

نصائح أخرى

يستخدم Message أداة:

عنصر واجهة المستخدم هو متغير من التسمية ، مصمم لعرض رسائل متعددة. يمكن أن يلف عنصر واجهة المستخدم النص ، وضبط عرضه للحفاظ على نسبة عرض إلى الارتفاع.

هنا هو الرمز:

entry = Label(self, text=text,
    anchor=NW, justify=LEFT,
    relief=RIDGE, bd=2)
def y(event, entry=entry):
  # FIXME: make this a global method, to prevent function object creation
  # for every label.
  pad = 0
  pad += int(str(entry['bd']))
  pad += int(str(entry['padx']))
  pad *= 2
  entry.configure(wraplength = event.width - pad)
entry.bind("<Configure>", y )
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top