我想找到一种 linux-wide(就它使用 X11 而言)的方式来控制我使用 Python 编程的应用程序的窗口几何形状。我所有的研究都指向使用python-xlib,这恰好是非常糟糕的记录。
我想实现的是:
注意:我不想用 Xlib 创建,而是想告诉 X 如何处理我用一些 GUI 库(例如 PyQt)创建的窗口。
我该怎么做呢?我意识到这个问题是一个很大的问题:你至少有关于我如何抓住我的窗户的提示吗?我可以在模块中的哪个位置找到我的答案?
编辑: nm 的回答提供了很好的资源,Unix StackExchange 上还有另一个问答,它提供了一个很好的例子,说明如何控制 X 显示的应用程序窗口。
我正在尝试创建一个由a组成的应用程序QMainWindow,其中央部件是一个QToolBar(它可能不常见,但出于我的目的,工具栏非常适合).码头只允许在下面.我加了QDockWidget它,并且QAction在QToolBar切换的QDockWidget打开和关闭与removeDockWidget()和restoreDockWidget().
默认大小QMainWindow为800 x 24,QToolBars maximumHeight也设置为24.在之后removeDockWidget()被调用时,QMainWindow的几何图形设置回(0,0,800,24)用setGeometry().
我想要实现的是在移除QMainWindow时将高度调整为24 DockWidget.在setGeometry()似乎因为宽度和位置的变化相应的工作,但有趣的是,高度不让步.那真的是我的问题:)
你觉得怎么回事?
这是一个屏幕演示,说明了手头的问题.
注意:如果我使用QWidget而不是QMainWindow创建相同的场景,并在子窗口小部件上使用show()或hide(),那么我可以adjustSize()毫无问题地调整父级的大小:上面的问题似乎是QMainWindow特定的.
我希望---用Python和Qt4 ---来旋转QPushButton(或至少它的文本),这样它就可以垂直站立.我在网上看过一些文档,但是我无法理解它 - 它在C语言中,我是C语言文盲.
根据我的阅读,我们需要重新实现paintEvent()处理程序,实例化并旋转QPainter().然而,我无法弄清楚如何为我只需要的一个QString或QPushButton做这个.我假设QPaintEvent会有一个"发送者"属性,就像信号一样,但它没有.我似乎可以从这个事件得到的是QRect或QRegion.
如何查找特定于我的按钮或其标签的事件?
或者,因为那是真正的问题,如何旋转QPushButton?
Mru,下面提出了一些C++示例,它完全重新实现了QPushButton.由于我对C++没有任何线索,因为我不需要完全重新实现,所以我试图painEvent()在Python中重新实现处理程序,基于该示例.
这是我翻译的内容,但它不起作用:\
#!/usr/bin/env python
from PyQt4 import QtGui, QtCore
import sys
class RotatedButton(QtGui.QPushButton):
    def __init__(self, text, parent, orientation = "west"):
        QtGui.QPushButton.__init__(self, text, parent)
        self.orientation = orientation
    def paintEvent(self, event):
        painter = QtGui.QStylePainter(self)
        if self.orientation == 'west':
            painter.rotate(90)
        elif self.orientation == 'east':
            painter.rotate(270)
        else:
            raise TypeError
        painter.drawControl(QtGui.QStyle.CE_PushButton, self.getSyleOptions())
    def getSyleOptions(self):
        options = QtGui.QStyleOptionButton()
        options.initFrom(self)        
        size = options.rect.size()
        size.transpose()
        options.rect.setSize(size)
        options.features = QtGui.QStyleOptionButton.None …Run Code Online (Sandbox Code Playgroud) 我看过很多帖子,但没有一个真正解决我的问题.使用Python,我试图在一个需要两个参数的函数中将方法作为参数传递:
# this is a method within myObject
def getAccount(self):
    account = (self.__username, self.__password)
    return account
# this is a function from a self-made, imported myModule
def logIn(username,password):
    # log into account
    return someData
# run the function from within the myObject instance
myData = myModule.logIn(myObject.getAccount())
Run Code Online (Sandbox Code Playgroud)
但是后来Python不高兴:它想要logIn()函数的两个参数.很公平.如果认为问题是getAccount()方法返回了一个元组,它是一个对象.我试过了:
def getAccount(self):
    return self.__username, self.__password
Run Code Online (Sandbox Code Playgroud)
但这要么没有任何区别.
那么如何将getAccount()中的数据传递给logIn()?当然,如果我不明白,我错过了编程逻辑中的一些基本内容:)
谢谢你的帮助.本杰明
我正在尝试使用X Window Manager(即Linux平台)解决在屏幕上为应用程序保留空间的问题.我已经看到这个问题已经解决并解决了Gtk,我用Qt问了同样的问题.由于没有人对Qt特定的问题作出反应(我也在其他论坛上提到过),我想我会概括我的问题:
谢谢,
本杰明
我正在创建一系列对象实例,我使用它们的__dict__属性保存和加载它们的属性。我想将一些属性保留在 之外__dict__,仅仅是因为我不希望它们被保存或加载。
进一步来说:
我创建了一个仅包含子对象列表的父对象。子对象__dict__被保存到文件并稍后加载以再次实例化它们。我希望子对象具有对父对象的引用,但我不希望将该引用保存到文件或从文件加载,因为它没有意义。
是否有任何语法可以从 中排除该属性__dict__?
PS:许多答案建议使用pickle,我目前正在使用json来保持数据可读。
我正在编程某种模拟,其数据在树中组织.主要对象World包含一堆方法和一个City对象列表.每个City对象又有一堆方法和一个Population对象列表.Population对象没有自己的方法,它们只包含属性.
我的问题是关于后面的Population对象,我可以从中衍生出来object或创建为字典.组织这些的最有效方法是什么?   
这几个案例说明了我的犹豫:
保存数据
 
我需要能够保存和加载模拟,为此我使用内置的json(我希望数据是人类可读的).由于程序是在树中组织的,因此在每个级别保存数据可能很麻烦.在这种情况下,群体最好作为附加到population列表的字典保存为City实例的属性.这样,保存只是将City实例传递给__dict__Json.
使用数据
 
如果我想操纵填充数据,它作为类实例比作为字典更容易.不仅语法简单,而且我还可以在编码时更好地享受内省特征.
性能
 
我最后不确定什么是最有效的资源.对象和字典最后几乎没有区别,因为每个对象都有一个__dict__属性,可用于访问其所有属性.如果我有大量的运行我的模拟City和Population对象,会是怎样用更少的资源:对象或字典?
那么,在树中组织数据的最有效方法是什么?字典或对象更受欢迎吗?或者组织数据树有什么秘密吗?
我已经读过一个关于(非)可订阅对象的线程,但是它没有告诉我该怎么做。
我有一个代码调用mypost私有模块。目的是建立邮件帐户,并为此创建模块中MailAccounts()定义的对象mypost。配置文件中描述了帐户数量及其各自的详细信息。当应用程序启动时,它将收集帐户信息并将其存储在字典中,该字典的结构为:accounts = {service : { <MailAccounts Object at xxxxx> : {username : myusername, password : mypassword}}}其中service可以是“ gmail”,而模块中MailAccounts定义的类在哪里mypost。到目前为止,一切都很好。但是,当我要设置帐户时,需要调用其方法:MailAccounts.setupAccount(username, password)。我通过迭代字典的每个MailAccount对象并要求运行该方法来执行此操作:
for service in accounts:
        for account in accounts[service]:
            account.setupAccount(account['username'], account['password'])
Run Code Online (Sandbox Code Playgroud)
但是您可能已经猜到它没有用,Python返回:
TypeError: 'MailAccount' object is not subscriptable
如果我手动创建相同的帐户,则可以:
account = MailAccount()
account.setupAccount('myusername', 'mypassword')
Run Code Online (Sandbox Code Playgroud)
现在,我相信这与我<MailAccount Object at xxxx>是词典密钥有关吗?这使得它不可订阅(可能意味着什么)?
不,这到底是什么意思不可订阅?在此示例中意味着什么?当然,在这种情况下,我该如何解决/绕过此问题?
谢谢,本杰明:)
我想执行一个只能在QApplication显示my 后调用的方法,即当它进入主事件循环时exec_()。我是 Qt4 的新手(使用 PyQt4):我希望有一个类似on_start()的回调,但没有找到。我需要创建一个线程或一个计时器吗?或者 API 中是否已经包含了一些回调?
python ×10
dictionary ×3
methods ×2
pyqt4 ×2
x11 ×2
arguments ×1
attributes ×1
data-storage ×1
event-loop ×1
linux ×1
object ×1
parent-child ×1
pyqt ×1
qdockwidget ×1
qmainwindow ×1
qpainter ×1
qt4 ×1
reference ×1
resources ×1
subscript ×1
timer ×1
tree ×1
window ×1
xlib ×1