تطبيق نظام الخط المشترك إلى كائنات متعددة في كسبيثون

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

  •  05-07-2019
  •  | 
  •  

سؤال

ومرات عديدة وسوف تستخدم نظام الخط نفسه لنص ثابت في تطبيق كسبيثون. حاليا أنا إجراء مكالمة SetFont() لكل كائن نص ثابت ولكن يبدو أن الكثير من العمل لا لزوم له. ومع ذلك، التجريبي كسبيثون وكسبيثون في كتابه العمل لا تناقش هذا.

هل هناك طريقة لتطبيق بسهولة نفس الأسلوب SetFont() لجميع هذه الكائنات النص دون إجراء مكالمات منفصلة في كل مرة؟

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

المحلول

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

نصائح أخرى

وربما محاولة شاء subclasses ترث كائن النص وطريقة __init__ صفك مجرد دعوة SetFont ()؟

وأو تفعل شيئا مثل:

def f(C):
  x = C()
  x.SetFont(font) # where font is defined somewhere else
  return x

وبعد ذلك فقط تزيين كل كائن النص الذي خلق مع معها:

text = f(wx.StaticText)

(وبطبيعة الحال، إذا StaticText منشئ يتطلب بعض المعلمات، وسوف تحتاج إلى تغيير الأسطر الأولى في تعريف الدالة f).

إذا تم بالفعل خلق كل الحاجيات، يمكنك تطبيق SetFont بشكل متكرر، على سبيل المثال مع وظيفة التالية:

def changeFontInChildren(win, font):
    '''
    Set font in given window and all its descendants.
    @type win: L{wx.Window}
    @type font: L{wx.Font}
    '''
    try:
        win.SetFont(font)
    except:
        pass # don't require all objects to support SetFont
    for child in win.GetChildren():
        changeFontInChildren(child, font)

وهناك استخدام المثال أن يسبب كل نص في frame لتصبح الخط الافتراضي مع نمط مائل:

newFont = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
newFont.SetStyle(wx.FONTSTYLE_ITALIC)
changeFontInChildren(frame, newFont)

والحل المذكورة أعلاه من قبلDzinX عملت لي عند تغيير الخط بشكل حيوي في الفريق أن لديها بالفعل الأطفال والتي تظهر بالفعل.

وانتهى بي الأمر تعديله على النحو التالي لأن الأصل أعطاني مشكلة في الحالات الزاوية (أي عند استخدام AuiManager مع إطارات العائمة).

def change_font_in_children(win, font):
    '''
    Set font in given window and all its descendants.
    @type win: L{wx.Window}
    @type font: L{wx.Font}
    '''
    for child in win.GetChildren():
        change_font_in_children(child, font)
    try:
        win.SetFont(font)
        win.Update()
    except:
        pass # don't require all objects to support SetFont
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top