我有一个依赖外部配置文件的 wxPython 应用程序。我想提供友好的消息对话框,如果有任何配置错误,就会显示该对话框。我尝试通过将 app.MainLoop() 调用包装在 try/ except 语句中来完成这项工作。
下面的代码适用于我的 MainWindow 框架类中的初始化代码,但不会捕获 MainLoop 中发生的任何异常。我怎样才能捕获这些异常呢?
if __name__ == '__main__':
app = MyApp(0)
try:
MainWindow(None, -1, 'My Cool App')
app.MainLoop()
except ConfigParser.Error, error_message:
messagebox = wx.MessageDialog(None, error_message, 'Configuration Error', wx.OK | wx.ICON_ERROR)
messagebox.ShowModal()
Run Code Online (Sandbox Code Playgroud)
我读过一些关于可以在 wx.App 类中重写的 OnExceptionInMainLoop 方法的内容,但我读到的源代码必须已过时(2004 年),因为 wx.App 似乎不再具有该名称的方法。
编辑:
我需要能够在主循环期间捕获未处理的异常,以便我可以进一步处理它们并将它们显示在错误对话框中,而不是静默传递,并且不终止应用程序。
sys.excepthook 解决方案级别太低,并且与 wxPython 主循环线程不能很好地配合。虽然到另一个答案的链接做了相同的尝试/除了环绕主循环,但由于 wxPython 再次为应用程序/ui 生成了不同的线程,所以它不起作用。
我正在尝试使用以下代码预先填充 wxPython DatePicker 的值:
month, day, year = runData[2][0:8].split('/')
displayDate = wx.DateTimeFromDMY(int(day), int(month) - 1, int(year))
self.datePicker.SetValue(displayDate)
Run Code Online (Sandbox Code Playgroud)
以下是打印值:
但是,datePicker 总是显示今天的日期。
有任何想法吗?
我在 Windows 7 上使用 Python 2.6.4 和 wxPython 2.8.10.1。
谢谢。
20/12/09 16:30 更新:
当我尝试处理来自有问题的 DatePickerCtrl 的信息时,出现以下错误:
Traceback (most recent call last):
File "test.py", line 1120, in onOk
dateLong = self.datePicker.GetValue()
File "c:\python26\lib\site-packages\wx-2.8-msw-unicode\wx\_controls.py", line
6465, in GetValue
return _controls_.DatePickerCtrlBase_GetValue(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "m_date.IsValid() == dt.IsValid() …Run Code Online (Sandbox Code Playgroud) 我正在编写一个 wxPython 应用程序,该应用程序在关闭所有窗口后仍保持打开状态 - 因此您仍然可以将新文件拖放到 OSX 停靠栏图标上(我使用myApp.SetExitOnFrameDelete(False))。
不幸的是,如果我关闭所有窗口,OSX 菜单栏将只包含一个“帮助”菜单。我想至少添加一个文件/打开菜单项,或者只保留主窗口的菜单栏。这在 wxPython 中以某种方式可能吗?
事实上,我也会对非 wxPython hack 感到满意(例如,在 pyobjc 中设置菜单,但在 wxPython 中运行其余的 GUI)。无论如何,OSX 中的 wxPython 开发都是一种黑客攻击;)
更新:我设法使用 Lyndsey Ferguson 的提示解决了这个问题。这是我所做的:
(-10000,-10000)使其不会在屏幕上闪烁(啊,多么肮脏的黑客!)是的,这真的很丑……如果有人提出更漂亮的解决方案,我将不胜感激。
更新2:实际上它可以用更简单的方式解决:如果我们不关闭最后一个窗口,只需隐藏它。并确保它不再响应菜单事件。
我正在寻找将 wxSlider 与浮点值一起使用的可能性,但找不到任何工作示例。这里提出了一个子类,但我不明白是否必须重新定义所有方法?
非常感谢可能的迹象。
我想实现一个具有以下行为的单元格的网格:
如果单元格文本不适合单元格,则应将其换行
单元格文本中的换行符 (\n) 也应该被处理
即,当您为单元格启用“换行”选项时,与 MS Excel、OO Calc 等表格编辑器中的行为相同。
我尝试按如下方式执行此操作:
import wx
import wx.grid
class MyGrid(wx.grid.Grid):
def __init__(self, parent = None, style = wx.WANTS_CHARS):
wx.grid.Grid.__init__(self, parent, -1, style = style)
self.CreateGrid(10, 10)
self.editor = wx.grid.GridCellAutoWrapStringEditor()
self.SetDefaultEditor(self.editor)
self.SetDefaultRenderer(wx.grid.GridCellAutoWrapStringRenderer())
self.SetCellValue(0, 0, "Line1\nLine2\nLine3")
self.SetRowSize(0, 100)
class MyFrame(wx.Frame):
def __init__(self, parent = None, title = "Multiline"):
wx.Frame.__init__(self, parent, -1, title)
self.Bind(wx.EVT_CHAR_HOOK, self.on_frame_char_hook)
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
panel.SetSizer(vbox)
grid = MyGrid(panel)
vbox.Add(grid, 1, wx.EXPAND | wx.ALL, 5)
self.grid = grid
btn_exit = …Run Code Online (Sandbox Code Playgroud) 现在,我正在像这样设置背景颜色,
dc.DrawRectangle(0,0,width,height)
你知道设置背景颜色的更好方法吗?
我想实现一个带有 2 个字段的状态栏。第一个左对齐,第二个右对齐。我想要的插图:
| | | | ================================================== ================================ | 一些状态文本。v. 1.0.32 |
我目前的代码:
self.CreateStatusBar(2)
self.SetStatusWidths([-1, -1])
Run Code Online (Sandbox Code Playgroud)
但是右边的字段是左对齐的,所以看起来像这样:
| | | | ================================================== ================================ | 一些状态文本。v. 1.0.32 |
有什么方法可以使正确字段中的文本向右对齐吗?
编辑:我将问题保持原样,因为它仍然是一个好问题,答案可能对其他人有用。但是,我会注意到,我通过使用完全不同的方法找到了解决我的问题的实际方法AuiManager;请参阅下面的答案。
我正在进行MultiSplitterWindow设置(在花了大量时间与SashLayoutWindow布局怪癖作斗争之后)。不幸的是,当我创建一个 时MultiSplitterWindow,我在拖动窗扇时看到了一些意想不到的行为:窗扇可以沿着布局的方向拖到包含窗口之外。至少可以说,这是我想避免的行为。
这是基本的设置(可以确认以下的wxPython的演示行为,只是取代leftwin了Panel1,等等,也请参阅下面的示例应用程序)。在我拥有的地方RootPanel/BoxSizer,有一个面板(或Frame,或您喜欢的任何类型的容器元素),BoxSizer
其中MultiSplitterWindow添加了 a - 再次,如演示中一样。
+--------------------------------+
| RootPanel/BoxSizer |
|+------------------------------+|
|| MultiSplitterWindow ||
||+--------++--------++--------+||
||| Panel1 || Panel2 || Panel3 |||
||| || || |||
||+--------++--------++--------+||
|+------------------------------+|
+--------------------------------+
Run Code Online (Sandbox Code Playgroud)
当你拖动时,你可能会得到这样的结果,在那里~并!
指示面板“存在”但没有显示:
+--------------------------------+
| RootPanel/BoxSizer |
|+-------------------------------|~~~~~~~~~~~~~+
|| MultiSplitterWindow | !
||+-----------------++-----------|~~++~~~~~~~~+!
||| Panel1 || Panel2 | !! Panel3 !!
||| || …Run Code Online (Sandbox Code Playgroud) 我正在尝试安装 wxpython (我有 python 3.5.2(32 位)和 Windows 10(64 位))我尝试过:pip install wx并且我得到: Failed Building Wheel for wxpython-phoenix 2 次,然后出现一个大错误行-->
我也尝试安装 Anaconda,但没有帮助。我该如何克服这个问题?
我用 wxPython 编写了一个程序。我们在许多具有不同显示配置的不同计算机上运行该程序。
例子:
1920x1080,DPI 100%
3000x2000,DPI 175%
1980x1080,DPI 150%(小型 13" 显示笔记本电脑)
我在全高清、DPI 100% 显示器上编码 - GUI 看起来不错!特别是在 3000x2000 上。TextCtrls、BitmapButtons 和Images 通常会改变它们的大小(它们变得更小)并且GUI 因不同的分辨率而变得混乱。DPI 150% 相同。
我试图通过在我的主类中设置我的进程的 DPI 意识来防止它,但这并不能始终如一地工作。
以下是我设置 DPI 意识的方式:
import ctypes
# Query DPI Awareness (Windows 10 and 8)
awareness = ctypes.c_int()
errorCode = ctypes.windll.shcore.GetProcessDpiAwareness(0, ctypes.byref(awareness))
# Set DPI Awareness (Windows 10 and 8)
errorCode = ctypes.windll.shcore.SetProcessDpiAwareness(2)
Run Code Online (Sandbox Code Playgroud)
题:
我将附上一个代码示例,其中我尝试尽可能多地进行大小和定位,以便为你们提供可能修复某些问题的基础。
import wx
import wx.adv
class Mywin(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self, parent, wx.ID_ANY, …Run Code Online (Sandbox Code Playgroud) python ×10
wxpython ×10
python-3.x ×2
wxwidgets ×2
dpi ×1
exception ×1
grid ×1
installation ×1
layout ×1
macos ×1
newline ×1
pyobjc ×1
python-3.5 ×1
slider ×1
word-wrap ×1