Как установить переменную true / false с помощью if?

1

Это трудно объяснить, но я постараюсь изо всех сил.

У меня есть эта часть моего кода

def hideConsole():
    hideConsole = win32console.GetConsoleWindow()
    win32gui.ShowWindow(hideConsole, 0)

который скрывает консоль, и у меня есть эта часть, чтобы включить ее

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

как я могу создать "систему", где, когда я нажимаю комбинацию клавиш один раз, консоль скрывается, и в следующий раз консоль появится? (измените значение hideConsole, 1)

  • 1
    Ответы ниже хороши, но имейте в виду, что если другие вещи могут показать / скрыть консоль, вам нужно будет выбрать лучшее решение, которое работает с другими игроками программы.
  • 0
    Хотя это не должно вызывать проблем, стилистически плохая идея иметь локальную переменную с тем же именем, что и содержащая ее функция. В конце концов, это не грамматически: hideConsole предлагает действие, а переменная содержит не действие, а вещь. consoleToHide может быть лучшим именем переменной. Не то, чтобы вы действительно нуждались в этом ; совершенно нормально просто написать win32gui.ShowWindow(win32console.GetConsoleWindow(), 0) .
Теги:

5 ответов

1
Лучший ответ

Вы можете использовать атрибут функции, который вы переключаете между истинным и ложным для каждого вызова:

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
  • 0
    В некотором смысле это Perl-ish по сравнению с созданием правильного класса, но мне это нравится. Простое лучше, чем сложное.
  • 0
    Красивая, никогда не думала об этом раньше.
1

С булевой переменной, примерно так:

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
  • 0
    Лети, познакомься с кувалдой. Мне это нравится.
  • 0
    @Gringo Suave: объектная ориентация хороша только для двух вещей: инкапсуляция состояния и связь через (полиморфные) сообщения, методы ASKA. ОО может быть реализовано с помощью классов или прототипов, или, если вы бедны, с помощью замыканий или, если вы очень бедны, с помощью указателей на функции. Не имеет значения В Python вы бы использовали класс. Решение Cat - это очевидный и правильный способ сделать это, поскольку оно инкапсулирует состояние и изменяет его только через вызовы методов.
Показать ещё 3 комментария
0
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

Если консоль содержит внутреннее состояние видимости, вы можете использовать ее вместо глобальной переменной.

0

Вам нужно как-то поддерживать состояние:

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

Если возможно, напишите это как часть класса. Затем вы можете сохранить hidden переменную, инкапсулированную классом, а не плавать в глобальном пространстве имен.

  • 0
    Тернар Python if записывается как <true> if <expr> else <false> , а не с ?: .
  • 0
    Ах, да, я работаю со многими языками и собираю их вместе. Спасибо за исправление.
Показать ещё 3 комментария
0

Вы можете использовать переменную состояния hideValue с начальным значением 0 и для каждого события клавиатуры:

hideValue = 1 - hideValue

Это приведет к переключению hideValue между 0 и 1.

Затем вы можете вызвать win32gui.ShowWindow(hideConsole, hideValue).

  • 0
    Уловки как это должны сопровождаться поясняющим комментарием все же. Использование логического флага и not занимает больше строки, но проще.
  • 0
    Лучше (более читабельно) использовать логические значения. Например: hidevalue = False , а затем hidevalue = not hidevalue
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню