【问题标题】:wxpython won't draw rectangle on panelwxpython 不会在面板上绘制矩形
【发布时间】:2014-06-23 15:54:00
【问题描述】:

我正在尝试制作聊天客户端,在其中获取用户输入并将其显示在我要绘制的白色矩形上。我尝试在面板上绘制矩形,但出现此错误

Traceback (most recent call last):
  File "C:\Python27\client with gui.py", line 26, in <module>
    frame = WindowFrame(None, 'ChatClient')
  File "C:\Python27\client with gui.py", line 12, in __init__
    self.panel.Bind(wx.EVT_PAINT, self.OnPaint)
AttributeError: 'WindowFrame' object has no attribute 'panel'


import socket
import wx

class WindowFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title = title, size=(500, 400))
        panel=wx.Panel(self)
        panel.SetBackgroundColour("#E6E6E6")
        self.control = wx.TextCtrl(panel, style = wx.TE_MULTILINE, size =(410, 28), pos=(0,329))

        sendbutton=wx.Button(panel, label ="Send", pos =(414,325), size=(65,35))
        self.panel.Bind(wx.EVT_PAINT, self.OnPaint)

        self.Centre()
        self.Show()


    def OnPaint(self, event):
        dc = wx.PaintDC(self)
        dc.SetPen(wx.Pen('#d4d4d4'))
        dc.SetBrush(wx.Brush('#c56c00'))
        dc.DrawRectangle(10, 15, 90, 60)
        self.Show(True)
if __name__=="__main__": 
    app = wx.App(False)
    frame = WindowFrame(None, 'ChatClient')
    app.MainLoop()

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    我相信我已经在 OP 的other question 中回答了这个问题,这与这个基本相同。

    def OnPaint(self, event):
        dc = wx.PaintDC(self.panel)  # <<< This was changed
        dc.SetPen(wx.Pen('#d4d4d4'))
        dc.SetBrush(wx.Brush('#c56c00'))
        dc.DrawRectangle(10, 15, 90, 60)
    

    您想绘制到面板,而不是框架。在 OP 的代码中,他们告诉 wx.PaintDC 绘制到 self,它指的是框架。我不知道为什么这会在一个操作系统上工作,除非是偶然的。它对@user667648 有效的事实很奇怪。我会将其归档为错误。绘制到面板的正确方法是上面的。

    【讨论】:

    • 哈哈,我觉得它只在某些情况下有效,因为有一个错误,这很有趣。我会在这里保留我的答案,因为我仍然认为它解决了他的部分问题,并且如果有人想提交错误,我不熟悉如何在那里提交错误。 wx-3.0-osx-cocoa :)
    • 我认为您只需访问 wxPython 的网站并单击“File a bug”链接即可。然后按照说明进行操作,确保将相应的下拉菜单更改为正确版本的 wxPython
    • 好的,提交错误报告。
    【解决方案2】:

    这一行:

        self.panel.Bind(wx.EVT_PAINT, self.OnPaint)
    

    应该是:

        panel.Bind(wx.EVT_PAINT, self.OnPaint)
    

    你的类没有属性panel,但它在init中有一个名为panel的局部变量。

    或者,您可以考虑将面板设为属性:

    import socket
    import wx
    
    class WindowFrame(wx.Frame):
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, title = title, size=(500, 400))
            self.panel=wx.Panel(self)
            self.panel.SetBackgroundColour("#E6E6E6")
            self.control = wx.TextCtrl(self.panel, style = wx.TE_MULTILINE, size =(410, 28), pos=(0,329))
    
            sendbutton=wx.Button(self.panel, label ="Send", pos =(414,325), size=(65,35))
            self.panel.Bind(wx.EVT_PAINT, self.OnPaint)
    
            self.Centre()
            self.Show()
    
    
        def OnPaint(self, event):
            dc = wx.PaintDC(self)
            dc.SetPen(wx.Pen('#d4d4d4'))
            dc.SetBrush(wx.Brush('#c56c00'))
            dc.DrawRectangle(10, 15, 90, 60)
            self.Show(True)
    if __name__=="__main__": 
        app = wx.App(False)
        frame = WindowFrame(None, 'ChatClient')
        app.MainLoop()
    

    编辑:正如 Mike 指出的,绘图程序还有另一个问题。有趣的是我的电脑没有抱怨这个......

    【讨论】:

    • 谢谢,但由于某种原因我看不到矩形,我的按钮现在被灰色覆盖
    • @user3768136:很有趣,我不知道为什么。我放了一张它对我来说是什么样子的照片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2019-07-15
    • 1970-01-01
    • 2012-06-01
    • 2012-06-16
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多