wxPython - 在调整大小之前没有可见内容的帧

时间:2016-04-17 22:44:51

标签: wxpython

我有一个800x600px的框架。看起来不错(800x600px)。我有一个改变我的面板的功能:

def change(self, evt): 
    self.Destroy()
    Ustawienia(frame)
    frame.Show()
    frame.Centre()

在我的代码的底部是:

if __name__ == "__main__":
app = wx.App(False)
frame = wx.Frame(None, wx.ID_ANY, size=(800, 600))
Glowne(frame)
frame.Show()
app.MainLoop()

它工作正常,但结果与图像一样。当我最大化窗口(调整大小)时,它看起来不错。它是800x600,但在我调整窗口大小之前没有内容文本。我的代码中的错误在哪里?

这是有效的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wx, xlrd, os, sys, json
reload(sys)
sys.setdefaultencoding('utf-8')
with open('config1.json', 'r') as f:
    config = json.load(f)

class Glowne(wx.Panel):

def __init__(self, *args, **kwargs):
    global workbook, sheet, col, col1, vsizer1, b, hsizer2, vsizer2, vsizer3
    wx.Panel.__init__(self, *args, **kwargs)
    with open('config1.json', 'r') as f:
        config = json.load(f)

    workbook = xlrd.open_workbook(os.path.join(os.pardir, config['plik']['rejestr']))
    sheet = workbook.sheet_by_index(1)
    sheet1 = workbook.sheet_by_index(0)

    col = sheet.col(8)  # 1st row
    col1 = sheet1.col(8)

    linia = wx.StaticLine(self, size=(600,1))

    vsizer1 = wx.BoxSizer(wx.VERTICAL)   # wszystkie + plik rejestru
    hsizer1 = wx.BoxSizer(wx.HORIZONTAL) # buttony   
    hsizer2 = wx.BoxSizer(wx.HORIZONTAL) # nazwy rewirów


    vsizer2 = wx.BoxSizer(wx.VERTICAL) # zliczone sprawy rewir1
    vsizer3 = wx.BoxSizer(wx.VERTICAL) # zliczone sprawy rewir2
    hsizer3 = wx.BoxSizer(wx.HORIZONTAL) # sprawy obok siebie rewirami

    plik = 'Aktualnie wybrany plik to: ' + config['plik']['rejestr']

    font = wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
    rej = wx.StaticText(self, 1, plik, style=wx.ALIGN_CENTER)
    rej.SetFont(font)

    #self.btn2 = wx.Button(self, -1, "Zlicz sprawy", (300, 50))
    self.btn1 = wx.Button(self, -1, u"Zmień plik rejestru")
    self.btn = wx.Button(self, -1, u"Ustawienia (dodawanie/usuwanie pracowników)")

    b = 2
    vsizer1.Add(rej, 0, wx.ALIGN_CENTER | wx.ALL, b)

    #hsizer1.Add(self.btn2, 1, wx.ALL, b)
    hsizer1.Add(self.btn, 1, wx.ALL, b)
    hsizer1.Add(self.btn1, 1, wx.ALL, b)

    hsizer3.Add(vsizer2, 2,  wx.ALL, b)
    hsizer3.AddSpacer((140,0))
    hsizer3.Add(vsizer3, 2,  wx.ALL, b)

    z = wx.StaticText(self, 1, u'DZIAŁ I')
    z.SetFont(font)
    hsizer2.Add(z, 1,wx.ALL, b)
    z1 = wx.StaticText(self, 1, u'DZIAŁ II')
    hsizer2.AddSpacer((180,0))
    z1.SetFont(font)
    hsizer2.Add(z1, 1,wx.ALL, b)

    vsizer1.Add(hsizer1, 1,wx.ALIGN_CENTER | wx.ALL, b)
    vsizer1.Add(hsizer2, 0,wx.ALIGN_CENTER | wx.ALL, b)
    vsizer1.Add(linia, 0, wx.ALIGN_CENTER | wx.ALL, 10)
    vsizer1.Add(hsizer3, 5,wx.ALIGN_CENTER | wx.ALL, b)

    self.SetSizer(vsizer1)
    #self.Bind(wx.EVT_BUTTON, self.wyswietlanie_cale, self.btn2)
    self.wyswietlanie()
    self.Bind(wx.EVT_BUTTON, self.change, self.btn)

def change(self, evt):
    self.Destroy()
    frame.SetTitle('Ustawienia programu')
    Ustawienia(frame)


def wyswietlanie(self):
    '''Funkcja, która zlicza i wyświetla ilość spraw pracowników'''
    #self.btn2.Disable()
    with open('config1.json', 'r') as f:
        config = json.load(f)
    policzone_1 = []
    policzone_2 = []
    z = 0
    for nazw in config['dzial1']:
        print nazw
        print config['dzial1'][nazw]
        x = config['dzial1'][nazw]   #nazwisko z pliku excela
        print x
        nazwisko = 0
        for index, cell_obj in enumerate(col1):
            if cell_obj.value == x:
                nazwisko += 1
        policzone_1.append((nazw, nazwisko))

    for nazw in config['dzial2']:
        print nazw
        print config['dzial2'][nazw]
        x = config['dzial2'][nazw]   #nazwisko z pliku excela
        print x
        nazwisko = 0
        for index, cell_obj in enumerate(col):
            if cell_obj.value == x:
                nazwisko += 1
        policzone_2.append((nazw, nazwisko))

    posortowane1 = sorted(policzone_1,key=lambda x:x[1], reverse=True)
    posortowane2 = sorted(policzone_2,key=lambda x:x[1], reverse=True)
    for i in posortowane1:
        print i
        z += 20
        wynik = '%s: %s' % (i[0], i[1]) 
        sprawy = wx.StaticText(self, -1, wynik)
        vsizer2.Add(sprawy, 1,wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, b)


    for i in posortowane2:
        print i
        z += 20
        wynik = '%s: %s' % (i[0], i[1]) 
        sprawy = wx.StaticText(self, -1, wynik)
        vsizer3.Add(sprawy, 1,wx.ALIGN_CENTER_HORIZONTAL | wx.ALL, b)


class Ustawienia(wx.Panel):
    with open('config1.json', 'r') as f:
        config = json.load(f)
def __init__(self, *args, **kwargs):
    global odstep, odstep1
    wx.Panel.__init__(self, *args, **kwargs)
    self.SetSize((800,600))
    odstep = 0
    odstep1 = 0
    font = wx.Font(13, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
    for nazwisko in config['dzial1']:
        odstep += 22
        self.nazwisko1 = wx.StaticText(self, -1, nazwisko, (100, 10 + odstep))
        self.nazwisko1.SetFont(font)
        btn_usuwanie = wx.Button(self, -1, u"Usuń", (275, 10 + odstep))
        self.Bind(wx.EVT_BUTTON, lambda evt, i: Program.Usuwanie(evt, i), btn_usuwanie)
    wx.StaticText(self, -1, 'DZIAL I', (110, 0), style=wx.ALIGN_CENTER).SetFont(font)
    print odstep
    for nazwisko in config['dzial2']:
        odstep1 += 22
        self.nazwisko2 = wx.StaticText(self, -1, nazwisko, (460, 10 + odstep1))
        self.nazwisko2.SetFont(font)
        self.btn_usuwanie_2 = wx.Button(self, -1, u"Usuń", (650, 10 + odstep1))
        self.btn_usuwanie_2.Bind(wx.EVT_BUTTON, lambda nazwisko=self.nazwisko2: self.usuwanie(nazwisko))
    print odstep1
    wx.StaticText(self, -1, 'DZIAL II', (480, 0), style=wx.ALIGN_CENTER).SetFont(font)
    self.btn = wx.Button(self, -1, "Change panel", (345, 500))
    self.btn_dodaj_dzial1 = wx.Button(self, -1, "Add name", (100, 42 + odstep))
    self.btn_dodaj_dzial2 = wx.Button(self, -1, "Add name", (480, 42 + odstep1))
    self.Bind(wx.EVT_BUTTON, lambda rewir: self.nowy_pracownik(self, 'dzial1'), self.btn_dodaj_dzial1)
    self.Bind(wx.EVT_BUTTON, lambda rewir: self.nowy_pracownik(self, 'dzial2'), self.btn_dodaj_dzial2)


def nowy_pracownik(self, item, rewir):
    nowy_pracownik = []
    prawda = True
    with open('config1.json', 'r') as f:
        config = json.load(f)
    while prawda:
        dlg = wx.TextEntryDialog(self, u'Wpisz imię i nazwisko', defaultValue='')
        if dlg.ShowModal() == wx.ID_OK:
            result = dlg.GetValue()
            if len(result) > 0:
                prawda = False
            else:
                wx.MessageBox(u'Wpisz coś!!!', 'Info', wx.OK | wx.ICON_INFORMATION)
            nowy_pracownik.append(result)
        else:
            prawda = False
            dlg.Destroy()
    prawda1 = True
    while prawda1:
        dlg1 = wx.TextEntryDialog(self, u'Wpisz nazwę do wyszukiwania', defaultValue='')
        if dlg1.ShowModal() == wx.ID_OK:
            result = dlg.GetValue()
            if len(result) > 0:
                prawda1 = False
            else:
                wx.MessageBox(u'Wpisz coś!!!', 'Info', wx.OK | wx.ICON_INFORMATION)
            nowy_pracownik.append(result)
        else:
            prawda = False
            prawda1 = False
            dlg1.Destroy()
    config[rewir][str(nowy_pracownik[0])] = str(nowy_pracownik[1])
    with open('config1.json', 'w') as f:
        json.dump(config, f, sort_keys=True, indent=2, ensure_ascii=False)
    self.change1(self)

def change1(self,evt): 
    global config
    with open('config1.json', 'r') as f:
        config = json.load(f)
    self.Destroy()
    Ustawienia(frame)


if __name__ == "__main__":
    app = wx.App(False)
    frame = wx.Frame(None, wx.ID_ANY, size=(800, 600))
    Glowne(frame)
    frame.Show()
    app.MainLoop()

我在Ustawienia(wxPanel)添加了self.SetSize((800,600))。我很抱歉丑陋的代码和外语......

My new Panel - without visible content

1 个答案:

答案 0 :(得分:0)

我的猜测是你需要在新面板或顶级sizer上调用Layout。通常当您销毁窗口小部件或面板并用新窗口替换它们时,它们不会自动调整大小,而不会刷新。调整大小时,会触发导致应用程序刷新屏幕的事件。通过调用Layout,它应该在不调整帧大小的情况下进行所需的刷新。

相关问题