импортированный файл Python не вернет переменную из класса в исходный файл - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу, чтобы код импортировал файл python, который отображает окно tkinter с 2 кнопками. В зависимости от того, какую кнопку пользователь нажимает, он запускает функцию, которая должна вернуть определенную строку в исходный файл Python. Я делал это раньше, возвращая содержимое поля ввода в исходный файл, но для этой задачи у меня нет подсказки, так как код имеет смысл для меня, и ошибки не возникает?

Оригинальный код Python:

def menu():
    import Menu_window
    Login_or_create= Menu_window.start()
    print(Login_or_create)

    if Login_or_create == "Login":
        print("Logged in")

    if Login_or_create == "Create":
        print("Creating user")

Импортированный файл с именем Menu_Window.py:

from tkinter import *
from tkinter import ttk

class Menu_window():
    def __init__(self,window):
        self.window = window
        self.window.title("Menu")

        bottom_frame=LabelFrame(self.window)
        bottom_frame.grid(row=2)

        Login= Label(text = "Hello, Please login or create an account to play!")
        Login.grid(row=0)

        ttk.Button(bottom_frame,text = 'Login',command = returN()).grid(row=0)
        ttk.Button(bottom_frame,text = 'Create account',command = returN2()).grid(row=0,column=1)

def returN():
    return "Login"

def returN2():
    return "Create"

def start():
    window=Tk()
    Login_or_Create=Menu_window(window)
    window.mainloop()
    window.destory()

1 Ответ

0 голосов
/ 08 ноября 2018

В вашем коде есть 3 основных недостатка.

  1. Login_or_create = Menu_window.start() всегда будет None здесь. Это не присваивается значение из команд возврата на ваших кнопках.

  2. Когда кнопка вызывает функцию и вы пытаетесь что-то вернуть, кнопка просто игнорирует это возвращаемое значение. Он никогда не будет присвоен вашей переменной, где вы назвали Menu_window.Start().

  3. Чтобы взаимодействовать между классами, вам нужно передать один атрибут класса или сам класс другому. Поэтому в этом случае я передаю Menu() на MenuWindow(), чтобы иметь возможность вызвать метод, чтобы проверить, какая кнопка была нажата.

Я отредактировал ваш код, чтобы более точно следовать правилам стиля PEP8. Я также преобразовал ваш Menu_window класс для наследования от tkinter tk для простоты использования.

Переименовано имя файла в соответствии с именем класса.

Начиная с py код файла:

class Menu():
    def __init__(self):
        import MenuWindow
        MenuWindow.start(self)

    def check_tracker(self, tracker):
        if tracker == "Login":
            print("Logged in")

        if tracker == "Create":
            print("Creating user")

Menu()

Файл MenuWindow.py:

import tkinter as tk
from tkinter import ttk

class MenuWindow(tk.Tk):
    def __init__(self, controller):
        tk.Tk.__init__(self)
        self.title("Menu")
        self.controller = controller
        bottom_frame= tk.LabelFrame(self)
        bottom_frame.grid(row=2)
        tk.Label(text = "Hello, Please login or create an account to play!").grid(row=0)
        ttk.Button(bottom_frame, text='Login', command=self.return_n).grid(row=1)
        ttk.Button(bottom_frame, text='Create account', command=self.return_n2).grid(row=1, column=1)
        self.mainloop()

    def return_n(self):
        self.controller.check_tracker("Login")

    def return_n2(self):
        self.controller.check_tracker("Create")

def start(x):
    MenuWindow(x)

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...