我有一个(单行)TextCtrl.用户将数据输入到此中.当他们按回车键时,需要提取该框的内容以便对其进行处理.我无法弄清楚如何抓住进入被按下.
根据该文档,与风格wx.TE_PROCESS_ENTER我TextCtrl设置,它应该在的盒子,我会再搭上被按下时输入生成wx.EVT_COMMAND_TEXT_ENTER事件.然而,wx.EVT_COMMAND_TEXT_ENTER似乎不存在(我得到"模块没有属性EVT_COMMAND_TEXT_ENTER),所以我有点卡住.谷歌搜索只是得到几个人抱怨wx.EVT_COMMAND_TEXT_ENTER不起作用,所以我想我需要另一种方式.
我创建wx.TextEntryDialog如下:
import wx
dlg = wx.TextEntryDialog(self, 'Rules:', 'Edit rules',
style=wx.TE_MULTILINE|wx.OK|wx.CANCEL)
dlg.SetValue(self.rules_text.Value)
if dlg.ShowModal() == wx.ID_OK:
…
Run Code Online (Sandbox Code Playgroud)
这会导致对话框太小而无法满足我的需求,并且无法调整大小:

我的问题是:如何使对话框变大和调整大小? 我尝试添加的标志wx.DEFAULT_DIALOG_STYLE和wx.RESIZE_BORDER,但除了曾与点替换文本没有影响:
dlg = wx.TextEntryDialog(self, 'Rules:', 'Edit rules',
style=wx.TE_MULTILINE|wx.OK|wx.CANCEL|wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER)
Run Code Online (Sandbox Code Playgroud)

我正在制作一个wxpython应用程序,我将使用各种冻结实用程序进行编译,以便为多个平台创建可执行文件.
该程序将成为基于图块的游戏引擎的地图编辑器
在这个应用程序中,我想提供一个脚本系统,以便高级用户可以修改程序的行为,如修改项目数据,将项目导出到不同的格式等.
我希望系统能像这样工作.
用户将他们希望运行的python脚本放入样式文本框中,然后按一个按钮执行脚本.
到目前为止,我很擅长这一切,这些都非常简单.从文本框中获取脚本作为字符串使用内置函数compile()将其编译为cod对象,然后使用exec语句执行脚本
script = textbox.text #bla bla store the string
code = compile(script, "script", "exec") #make the code object
eval(code, globals())
Run Code Online (Sandbox Code Playgroud)
问题是,我想确保此功能不会导致任何错误或错误,
如果脚本中有import语句.考虑到代码是用py2exe或py2app之类的东西编译的,这会导致任何问题吗?
我如何确保用户不能破坏程序的关键部分,如修改部分GUI,同时仍允许他们修改项目数据(数据保存在自己的模块中的全局属性中)?我认为这意味着修改传递给eval函数的全局变量dict.
如何确保此eval不会导致程序因长循环或无限循环而挂起?如何确保用户代码中引发的错误不会导致整个应用程序崩溃?
基本上,如何避免在允许用户运行自己的代码时可能出现的所有问题?
编辑:关于给出的答案
我觉得到目前为止任何答案都没有真正回答我的问题,是的,他们已经得到了部分回答,但并未完全回答.我很清楚,不可能完全停止不安全的代码.对于一个人(甚至是一个人)而言,人们过于聪明地想到绕过安全系统并阻止它们的所有方法.
事实上,如果他们这样做,我真的不在乎.我更担心一些人无意中打破了他们不知道的事情.如果有人真的想要他们可以通过脚本功能撕毁应用程序,但我不在乎.这将是他们的实例,他们创建的所有问题将在他们重新启动应用程序时消失,除非他们已经搞乱了HD上的文件.我想防止用户给某些东西愚蠢时出现的问题.
像IOError,SystaxErrors,InfiniteLoopErrors等.
现在关于范围的部分已得到解答.我现在明白如何定义可以从eval函数访问哪些函数和全局变量但是有没有办法确保如果它花费太长时间可以停止执行它们的代码?
也许是一个绿色线程系统?(绿色,因为它会让用户担心线程安全性)
此外,如果用户使用import module语句从甚至未在类的其余部分中使用的默认库加载模块.这会导致应用被Py2exe,Py2app或Freeze冻结的问题吗?如果他们称标准库的模态外?模态是否与冻结的可执行文件存在于同一目录中是否足够?
我想在没有创建新问题的情况下得到这些答案,但如果必须,我会这样做.
我刚买了一台带Lion的新电脑.我已经下载并安装了Python 2.7和wxPython 2.8(适用于2.7).我知道Python附带了系统,但我更喜欢使用官方系统.
无论如何,在IDLE上输入"import wx"后,我收到以下消息:
回溯(最近一次调用最后一次):文件"",第1行,导入wx文件"/usr/local/lib/wxPython-unicode-2.8.12.1/lib/python2.7/site-packages/wx-2.8-mac -unicode/wx/init .py",第45行,来自wx._core import*文件"/usr/local/lib/wxPython-unicode-2.8.12.1/lib/python2.7/site-packages/wx-2.8 -mac-unicode/wx/_core.py",第4行,导入核心 ImportError:dlopen(/usr/local/lib/wxPython-unicode-2.8.12.1/lib/python2.7/site-packages/wx-2.8 -mac-unicode/wx/core .so,2):找不到合适的图像.找到了:/usr/local/lib/wxPython-unicode-2.8.12.1/lib/python2.7/site-packages/wx-2.8-mac-unicode/wx/ core .so:通用包装器中没有匹配的架构
我相信它发生是因为wxPython只支持32位,但我无法弄清楚如何强制python在32位上运行.
有人可以帮忙吗?先感谢您.
我正在寻找一个示例代码来在wx.Panel中加载PNG图像,我已经看到其中一些使用Python成像库(PIL)和一堆拥抱的代码行.
我想保持我的环境尽可能少的库,这意味着没有PIL,因为我不需要做任何形式的图像处理,我想wx启用这样的处理.
谢谢
编辑:代码从迈克的答案实现这一点
image = wx.Image('path/to/image.png', wx.BITMAP_TYPE_ANY)
imageBitmap = wx.StaticBitmap(myPanel, wx.ID_ANY, wx.BitmapFromImage(image))
Run Code Online (Sandbox Code Playgroud)
然后imageBitmap可以用作任何其他wx小部件.
我设置了on_motion处理EVT_MOTION.我希望鼠标位置以交互方式生成特定于坐标的图像,但是WxPython 在注册连续的运动事件时有大约400ms的延迟.这使界面变得迟钝.
为什么EVT_MOTION这么慢,我该如何解决?我在Ubuntu 11.10和WinXP中试过它,延迟是可比的吗?
我需要快速响应时间来从图像中选择一部分,如图所示.就目前而言,"十字线"跟随鼠标的速度太慢.

这是我试过的代码EVT_MOTION:
def on_motion(self, event):
"""mouse in motion"""
#pt = event.GetPosition()
self.mouseover_location = event.GetPosition()
self.t2 = time.time()
print "delay",self.t2 - self.t1
self.t1 = self.t2
delay 0.379776954651
delay 0.00115919113159
delay 0.421130895615
delay 0.416938066483
delay 0.376848936081
delay 0.387464046478
delay 0.40311384201
delay 0.392899036407
delay 0.385301113129
delay 0.422554969788
delay 0.355197906494
Run Code Online (Sandbox Code Playgroud) 我刚开始使用Sublime Text 2.
我使用Sublime for python,但是当我使用CTRL+时B它不会运行我的wxPython GUI应用程序.它可以运行Tkinter应用程序.
为什么是这样?从Sublime运行wxPython应用程序需要做什么?
我有一个wx.Dialog子类,当用户单击OK按钮时需要执行几个清理操作.该的wx.Dialog文件称,点击确定或取消应该发射EVT_CLOSE事件:
EVT_CLOSE:用户或以编程方式关闭对话框(请参阅Window.Close).用户可以生成此事件,单击关闭按钮(通常是标题栏右上角的"X")(如果存在)(请参阅CLOSE_BOX样式)或单击带有ID_CANCEL或ID_OK ID的按钮.
但是,我正在使用WX 2.9.5.0(通过wxPython),当我在此测试应用程序中单击"确定"或"取消"时,不会调用OnClose方法.单击系统的关闭按钮(我正在使用OS X)时调用OnClose.我是否实现了此事件处理错误或者wx.Dialog是否真的不符合其文档?在后一种情况下,拦截单击"确定"按钮的最佳方法是什么?
from __future__ import print_function
import wx
class TestDialog(wx.Dialog):
def __init__(self, parent):
wx.Dialog.__init__(self, parent, title='Test Dialog')
sizer = wx.BoxSizer(wx.VERTICAL)
message = wx.StaticText(self, wx.NewId(), 'This is some dummy text')
sizer.Add(message)
ok_button = wx.Button(self, wx.ID_OK, 'OK')
cancel_button = wx.Button(self, wx.ID_CANCEL, 'Cancel')
btn_sizer = self.CreateStdDialogButtonSizer(wx.OK | wx.CANCEL)
btn_sizer.Add(cancel_button)
btn_sizer.Add(ok_button)
sizer.Add(btn_sizer)
self.SetSizer(sizer)
self.Bind(wx.EVT_CLOSE, self.OnClose)
def OnClose(self, event):
print('In OnClose')
event.Skip()
if __name__ == '__main__':
app = wx.App(False)
dialog = TestDialog(None)
result = dialog.ShowModal()
print('Result: {}'.format(result))
Run Code Online (Sandbox Code Playgroud) 我有一个TextCtrl在我的wxPython程序中,我想将其宽度设置为正好3个字符.但是,手动设置其大小的唯一方法是仅接受像素数.有没有办法指定字符而不是像素?
我使用wxPython制作了简单的代码编辑器.文件大小(python文件)是1.3 KB.但是当我使用PyInstaller创建可执行文件时,我得到30 MB的文件!有没有办法减少文件大小?顺便说一句,我不是导入整个wx库,只导入我需要的组件(ex from wx import Frame).
使用Linux,Fedora 18 64bit.