глобальная переменная не используется функциями - PullRequest
0 голосов
/ 20 марта 2019

Я определил эти глобальные переменные:

value1 = ""
value = ""

Обе переменные используются в двух разных функциях:

def function1():
  ...
  value1 = widget.get(selection1[0])

def function2():
  ...
  value = widget.get(selection0[0])

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

def function1():
  if value1 != "":
    if value != "":
      print(value1 + " | " + value
  else:
      print("Bar")

Я получаю | вместо переменных, которые должны быть заполнены вместо.

Ответы [ 3 ]

3 голосов
/ 20 марта 2019

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

Без глобальных:

x = 3

def setToFour():
    x = 4
    print(x)

print(x)
setToFour()
print(x)

Выход:

>> 3
>> 4
>> 3

Функция создает собственный x, устанавливает его в 4 и печатает. Глобальный x оставлен без изменений.

С глобальным:

x = 3

def setToFour():
    global x
    x = 4
    print(x)

print(x)
setToFour()
print(x)

Выход:

>> 3
>> 4
>> 4

Функция предписывает использовать глобальный x вместо создания собственного x, устанавливает его в 4, а затем печатает. Глобальный x был напрямую изменен и сохраняет свое новое значение.

1 голос
/ 20 марта 2019

если предположить, что вы используете tkinter, вам не нужно глобальное назначение.

Вам нужен объектно-ориентированный подход, и правильный инструмент, такой как StringVar () или IntVar (), зависит от природы вашей переменной.

см. Ниже, def callback (self), ваша функция1

import tkinter as tk

class App(tk.Frame):

    def __init__(self,):

        super().__init__()

        self.master.title("Hello World")

        self.value = tk.StringVar()
        self.value1 = tk.StringVar()

        self.init_ui()

    def init_ui(self):

        self.pack(fill=tk.BOTH, expand=1,)

        f = tk.Frame()

        tk.Label(f, text = "Value").pack()
        tk.Entry(f, bg='white', textvariable=self.value).pack()

        tk.Label(f, text = "Value1").pack()
        tk.Entry(f, bg='white', textvariable=self.value1).pack()

        w = tk.Frame()

        tk.Button(w, text="Print", command=self.callback).pack()
        tk.Button(w, text="Reset", command=self.on_reset).pack()
        tk.Button(w, text="Close", command=self.on_close).pack()

        f.pack(side=tk.LEFT, fill=tk.BOTH, expand=0)
        w.pack(side=tk.RIGHT, fill=tk.BOTH, expand=0)


    def callback(self):

        if self.value1.get():
            if self.value.get():
                print(self.value1.get() + " | " + self.value.get())
        else:
            print("Foo")

    def on_reset(self):
        self.value1.set('')
        self.value.set('')

    def on_close(self):
        self.master.destroy()

if __name__ == '__main__':
app = App()
app.mainloop()
0 голосов
/ 20 марта 2019

С помощью оператора присваивания переменная создается локально в функции python. Нужно объявить переменную глобально явно. например.

value1 = "Hello"
value = "World"
def function1():
    global value1
    global value
    print(value1, value1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...