Python 如何使用if设置真/假变量?

Python 如何使用if设置真/假变量?,python,windows,Python,Windows,这有点难以解释,但我会尽力的 我的代码里有这个部分 def hideConsole(): hideConsole = win32console.GetConsoleWindow() win32gui.ShowWindow(hideConsole, 0) 它隐藏了控制台,我有这个部分来启用它 def onKeyboardEvent(event): if event.KeyID == 192 and event.Alt == 32: hideConsole(

这有点难以解释,但我会尽力的

我的代码里有这个部分

def hideConsole():
    hideConsole = win32console.GetConsoleWindow()
    win32gui.ShowWindow(hideConsole, 0)
它隐藏了控制台,我有这个部分来启用它

def onKeyboardEvent(event):
    if event.KeyID == 192 and event.Alt == 32:
        hideConsole()
    return True

我如何制作一个“系统”,当我按下一次组合键时,控制台隐藏,下一次,控制台将显示?(更改HIDECONOLE,1值)

您可以使用初始值为0的状态变量
hideValue
,对于每个键盘事件:

hideValue = 1 - hideValue
这将在0和1之间切换
hideValue


然后您可以调用
win32gui.ShowWindow(hideconole,hideValue)

您需要以某种方式维护状态:

hidden = False

def toggleConsoleVisibility():
    global hidden

    hideConsole = win32console.GetConsoleWindow()
    win32gui.ShowWindow(hideConsole, 1 if hidden else 0)
    hidden = not hidden

def onKeyboardEvent(event):
    if event.KeyID == 192 and event.Alt == 32:
        toggleConsoleVisibility()
    return True
如果可能,将其作为类的一部分编写。然后可以将
隐藏
变量封装在类中,而不是在全局名称空间中浮动

con_visible = True

def setVisibility(visible):
    global con_visible
    hideConsole = win32console.GetConsoleWindow()
    win32gui.ShowWindow(hideConsole, int(visible))
    con_visible = bool(visible)

def onKeyboardEvent(event):
    if event.KeyID == 192 and event.Alt == 32:
        if con_visible:
            setVisibility(False)
        else:
            setVisibility(True)
    return True

如果控制台在内部保持其可见性状态,则最好使用该状态,而不是全局变量。

使用布尔变量,如下所示:

class Console(object):
    def __init__(self):
        self.is_hidden = False
        self.handle    = win32console.GetConsoleWindow()

    def toggle(self):
        win32gui.ShowWindow(self.handle, 1 if self.is_hidden else 0)
        self.is_hidden = not self.is_hidden

可以在每次调用时使用在true和false之间切换的函数属性:

def toggleConsole():
    toggleConsole.show = not getattr(toggleConsole, "show", True)
    console = win32console.GetConsoleWindow()
    win32gui.ShowWindow(console, int(toggleConsole.show))
下面是一个简单的示例,说明了该方法的工作原理:

>>> def test():
...     test.show = not getattr(test, "show", True)
...     print int(test.show)
... 
>>> test()
0
>>> test()
1
>>> test()
0

不过,像这样的技巧应该伴随着解释性的评论。使用布尔标志和
not
需要更多的行,但更简单。使用布尔值更好(更可读)。像这样:
hidevalue=False
,然后
hidevalue=not hidevalue
@delnan,@Denilson我刚刚注意到使用名称
showValue
而不是
hidevalue
,可读性会更好。关于切换布尔值或整数,我认为这基本上是在同一水平上,但也许你是对的。下面的答案很好,但也要记住,如果其他东西可以显示/隐藏控制台,你需要选择与该程序的其他玩家一起工作的最佳解决方案。虽然这不会在这里造成问题,从风格上讲,使用与包含函数同名的局部变量是个坏主意。毕竟它不符合语法:
hideConsole
表示一个动作,变量不包含动作,而是一个事物<代码>控制台隐藏可能是更好的变量名。并不是说你真的需要一个;只需编写
win32gui.ShowWindow(win32console.GetConsoleWindow(),0)
就可以了。Python的三元
if
写为
if else
,而不是
?:
。啊,是的,我使用多种语言并将它们混合在一起工作(感谢您的更正。有几个语法问题,但我喜欢这种方法。@cdhowie:Cat Plus Plus所说的。另外,除非
toggleconsolivebility()中声明了
hidden
您的代码不会运行,但会引发一个
未绑定的局部错误
。不过,使用
全局
通常是设计不好的标志。@pillmuncher:的确,感谢您提供了有关
全局
的提示。我通常设计类而不是使用全局变量,所以我对
全局
不是很熟悉。而且,我很确定这一点需要进入
ToggleConsoleVibility
,而不是
onKeyboardEvent
。飞吧,见见sledgehammer。我喜欢。@Gringo Suave:面向对象有两个好处:封装状态和通过(多态)进行通信消息、ASKA方法.OO可以通过类或原型实现,或者,如果你很差,可以通过闭包实现,或者如果你很差,可以通过函数指针实现。没关系。在Python中,你可以使用class.Cat解决方案,因为它封装状态并只通过方法调用来更改。是的,它的elegant,我喜欢它,没有说我不喜欢。只是觉得2到3行代码太重了。我认为
int(self.is_hidden)
更直接地传达了含义;底层API调用的参数是一个布尔意义上的整数,这仅仅是因为C中缺少真正的布尔类型(至少最初是这样)@KarlKnechtel:
ShowWindow
可以将几个整型常量作为第二个参数,而不仅仅是0和1。理想情况下,它应该是
SW_SHOWNORMAL
SW_HIDE
,而不是整数,但我不记得pywin32是否/在何处公开了这些。与创建一个合适的类相比,这有一种Perl风格的感觉,但我不知道喜欢它。简单总比复杂好。美丽,从未想过这一点。