PySide窗口出现在其他窗口下方

时间:2016-02-22 14:19:51

标签: windows admin pyside

我有一个需要以管理员身份运行的PySide应用。我使用了this post.

推荐的技术
import os
import sys
import time
from PySide.QtGui import *
from win32com.shell import shellcon
import win32com.shell.shell as shell
import win32con


def force_elevated():
    try:
        if sys.argv[-1] != 'asadmin':
            script = os.path.abspath(sys.argv[0])
            params = ' '.join([script] + sys.argv[1:] + ['asadmin'])
            shell.ShellExecuteEx(nShow=win32con.SW_SHOWNORMAL,
                                 fMask=shellcon.SEE_MASK_NOCLOSEPROCESS,
                                 lpVerb='runas',
                                 lpFile=sys.executable,
                                 lpParameters=params)
            sys.exit()
    except Exception as ex:
        print ex

class MyGui(QWidget):
    def __init__(self):
        super(MyGui, self).__init__()
        self.show()

app = QApplication(sys.argv)
force_elevated()
splash = QSplashScreen("logo.png")
splash.show()
time.sleep(2)
gui = MyGui()
app.exec_()

Windows UAC弹出并要求用户允许管理员权限。如果用户选择“是”,则应用程序的新实例将以管理员模式启动。如果用户选择“否”,则try语句将失败,程序将继续以非管理员模式运行。

问题是,当在非管理员模式下运行时,应用程序会在其他窗口后面启动,因此很容易认为它根本没有运行。使用cx_freeze生成可执行文件后,即使执行激活管理模式也会发生这种情况。

我无法将窗口置于最顶层。我已经尝试暂时将其设置在顶部(将其置于前面),然后将其关闭,但这不起作用。我还尝试使用各种库和内置函数来定位进程ID并告诉窗口将它带到前面。他们要么根本没有工作,要么不能可靠地工作。

有没有人有可靠的方法来确保PySide窗口出现在顶部?

1 个答案:

答案 0 :(得分:0)

您可以使用gui.raise_()

将窗口置于最前面