我在Autodesk Maya中开发工具.我构建的许多工具都有简单的窗口GUI,供动画师和建模人员使用.这些GUI通常包含您通常希望在任何基本窗口中看到的内容; 标签,列表,菜单,按钮,文本字段等.但是,您可以使用可用工具构建的UI的复杂性存在限制,特别是在可用小部件的类型中.
我有兴趣使用一些更高级的wxPython小部件,如ListView(网格),树等.这将涉及使用完整的wxFrame(窗口)来显示整个UI,这实际上意味着窗口将不再被绑在玛雅身上.不是交易破坏者,但这意味着当Maya被最小化时,窗口将不会跟随.
我之前尝试使用tkinter作为测试,但发现它需要MainLoop才能在自己的线程中运行.这是合乎逻辑的,但在我的情况下,它与Maya自己的线程冲突,基本上使Maya挂起,直到窗口关闭.这是因为Maya在主Maya GUI共享的单个线程中运行所有脚本,无论是MEL还是Python.这是为了防止一个脚本在另一个脚本尝试对同一个对象进行操作时删除一个对象.
wxPython具有相同的"mainloop"方法.我想知道它是否有任何解决方法,以便它可以在Maya中工作?
我为一个简单的问题道歉,但我没有在教程中看到这一点.
我有一个非常简单的gui,但我希望用户能够按下TAB键并让它从一个输入字段移动到另一个输入字段.我在Python 2.6中使用wxPython.
我有一个wxPython应用程序,在这个应用程序中,我可以从各种框架中选择和复制文本,但我不能从对话框中这样做.有没有办法做到这一点?
我理解我可以通过在对话框中放置某种TextCtrl来实现这一点,但我希望能够从标准的对话框中做到这一点.
编辑:
对不起,我应该更具体一点.我无法从Windows Vista或Mac下的wx.MessageBox中选择文本(无法访问Linux来尝试).以下是创建消息框的一个示例:
wx.MessageBox(str(msg), "Could not load ballots", wx.OK|wx.ICON_ERROR)
Run Code Online (Sandbox Code Playgroud)
我无法选择消息框的文本.
我遇到了wxPython的问题.下面发布了代码的简化版本(删除了空格,注释等以减小大小 - 但我的程序的一般格式保持大致相同).当我运行脚本时,静态文本正确地包装,但面板中的其他项不会向下移动(它们就好像静态文本只有一行,因此并不是所有内容都可见).如果我手动调整窗口/框架的大小,即使只是很小的数量,一切都会得到纠正并按原样显示.我拍摄了屏幕截图来显示这种行为,但我刚创建了这个帐户,因此没有必要的10个声望点可以发布图片.
为什么开始时显示不正确?我尝试了GetParent().Refresh()或Update()和GetTopLevelParent().Update()或Refresh()的各种组合.我已经尝试了所有我能想到的但却无法在不手动调整框架/窗口大小的情况下正确显示它.一旦重新调整大小,它就会按照我的要求运行.
信息:
Windows XP
Python 2.5.2
wxPython 2.8.11.0(msw-unicode)
有什么建议?谢谢!
码:
#! /usr/bin/python
import wx
class StaticWrapText(wx.PyControl):
def __init__(self, parent, id=wx.ID_ANY, label='', pos=wx.DefaultPosition,
size=wx.DefaultSize, style=wx.NO_BORDER,
validator=wx.DefaultValidator, name='StaticWrapText'):
wx.PyControl.__init__(self, parent, id, pos, size, style, validator, name)
self.statictext = wx.StaticText(self, wx.ID_ANY, label, style=style)
self.wraplabel = label
#self.wrap()
def wrap(self):
self.Freeze()
self.statictext.SetLabel(self.wraplabel)
self.statictext.Wrap(self.GetSize().width)
self.Thaw()
def DoGetBestSize(self):
self.wrap()
#print self.statictext.GetSize()
self.SetSize(self.statictext.GetSize())
return self.GetSize()
class TestPanel(wx.Panel):
def __init__(self, *args, **kwargs):
# Init the base class
wx.Panel.__init__(self, *args, **kwargs)
self.createControls()
def createControls(self):
# --- …Run Code Online (Sandbox Code Playgroud) 我试图添加一个工具提示来显示截断的ObjectListView的完整内容,直到它发现它具有内置的这样的功能:

我试图使使用wx.TipWindow,wx.PopupWindow和SuperToolTip我自己的工具提示,但没有人看作"天然",因为这一个.

虽然我知道这篇wiki文章据称可以为截断的wx.Listrctrls启用工具提示,但我并不真正理解如何让它工作.我也希望它只在某些内容被截断时起作用,而我希望能够用它来显示更多信息.
我猜SuperToolTip很接近,但当你删除'header'时,它会在顶部留下空白空间,而不是将文本居中在工具提示的中间并使其适合.
我试着查看ObjectListView,SuperToolTip和wxpython的源代码来尝试查找工具提示是如何创建的,但我无法找到实现它的低级部分.
那么我该如何调整工具提示,使它们看起来更像原生工具提示呢?
生成我当前弹出窗口的代码是:
text = "I'm a popup"
class PopUp(wx.TipWindow):
def __init__(self, parent, text):
wx.TipWindow.__init__(self, parent, text)
class PopUp2(wx.PopupWindow):
def __init__(self, parent, text):
wx.PopupWindow.__init__(self, parent)
st = wx.StaticText(self, parent, text)
# Import `from agw import supertooltip as STT`
popup3 = STT.SuperToolTip(text)
Run Code Online (Sandbox Code Playgroud) 我正在开发一个相当简单的wxpython GUI,并希望能够使用转义键关闭窗口.现在我只有一个执行sys.exit(0)的关闭按钮,但我想要使用转义键来执行此操作.
有谁知道这样做的方法?
import win32clipboard
import wx
from time import sleep
import sys
class MainFrame(wx.Frame):
def __init__(self,title):
wx.Frame.__init__(self, None, title="-RRESI Rounder-", pos=(0,0), size=(210,160))
panel=Panel(self)
icon = wx.Icon('ruler_ico.ico', wx.BITMAP_TYPE_ICO)
self.SetIcon(icon)
class Panel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
x1=10; x2=110
y1=40; dy=25; ddy=-3
boxlength=80
self.button =wx.Button(self, label="GO", pos=(100,y1+dy*3))
self.Bind(wx.EVT_BUTTON, self.OnClick,self.button)
self.button.SetDefault()
self.button2 =wx.Button(self, label="Close", pos=(100,y1+dy*4))
self.Bind(wx.EVT_BUTTON, self.OnClose, self.button2)
self.button.SetDefault()
self.Bind(wx.EVT_KEY_UP, self.OnKeyUP)
self.label1 = wx.StaticText(self, label="Input Number:", pos=(x1,y1+dy*1))
self.Input = wx.TextCtrl(self, value="1.001", pos=(x2,ddy+y1+dy*1), size=(boxlength,-1))
self.label0 = wx.StaticText(self, label="Round to closest: 1/", pos=(x1,y1+dy*0))
self.Denominator …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种简单的模式来使用窗口内的wx.grid.Grid对象获取自动适应窗口的效果。
到目前为止,我的4列网格在右侧有许多空白,但是我发现这非常难看,如果所有列根据窗口大小的变化而展开或折叠,效果都会更好!
有没有办法使它起作用?
我已经安装和二者试图wxpython-3.0和wxpython-2.8用于python2.7从标准cygwin回购(64位,运7).但是,当我启动Cygwin X服务器并尝试从wxPython教程运行最简单的"Hello World"脚本时:
# test.py
import wx
app = wx.App(False) # Create a new app, don't redirect stdout/stderr to a window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window.
frame.Show(True) # Show the frame.
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
我得到一个Gtk-WARNING **: Screen for GtkWindow not set最终以a结尾segmentation fault.
该DISPLAY变量被设置为:0(export DISPLAY=:0),对应于所启动的X服务器.
在cygwin使用wxPython启动脚本之前,wxPython是否已被破坏或是否需要其他一些过程?
我正在创建具有数百万个节点的树,但是当我切换到在树控件(wx.TR_MULTIPLE)上使用多选时,对树的操作变慢,我只单击选择一个节点,这花了我几秒钟的时间。当我使用单选样式(wx.TR_SINGLE)时,不会发生这种情况。
我试图不为任何节点设置数据,也没有使用任何事件,但是它仍然很慢。有什么方法可以在树控件上使用多选,而树仍然像单选一样快速?
我在下面粘贴了修改后的演示代码:
import wx
class MyTree(wx.TreeCtrl):
def __init__(self, parent, id, pos, size, style):
wx.TreeCtrl.__init__(self, parent, id, pos, size, style)
self.Bind(wx.EVT_TREE_SEL_CHANGED, self.item_changed)
def item_changed(self, evt):
print(self.GetItemData(evt.GetItem()))
class TreePanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
self.tree = MyTree(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TR_HAS_BUTTONS | wx.TR_MULTIPLE)
self.root = self.tree.AddRoot('ROOT')
node1 = self.tree.InsertItem(self.root, 0, 'Node 1', data='node 1')
for i in range(1000000):
self.tree.PrependItem(node1, 'Sub node 1: ' + str(i), data='Sub node 1: ' + str(i))
self.tree.Expand(self.root)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.tree, 1, wx.EXPAND)
self.SetSizer(sizer)
class MainFrame(wx.Frame): …Run Code Online (Sandbox Code Playgroud)