导入的python文件不会将变量从类返回到原始文件

时间:2018-11-08 14:43:48

标签: python tkinter import

我希望代码导入一个python文件,该文件显示一个带有2个按钮的tkinter窗口。根据用户按下哪个按钮,它运行一个函数,该函数应将某个字符串返回到原始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 :(得分:1)

您的代码中存在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