首页 > 编程问答 >如何从另一个 python 文件运行一个 python 文件

如何从另一个 python 文件运行一个 python 文件

时间:2024-07-25 16:30:06浏览次数:10  
标签:python file oop methods

我正在尝试从另一个 python 运行一个 python 文件,但是当涉及到调用另一个 python 文件中的方法时,它只会重新运行当前的 python 文件。

我尝试了这段代码。我将导入放入 log_user_in 方法中,因为如果我将其导入到文件顶部,则会出现循环导入错误。 这是我的代码片段

from tkinter import *
import mysql.connector
import customtkinter
import math
from datetime import datetime 
class LoginOrReg:

    def __init__(self, db, cursor, login_username, data):
        self.db = mysql.connector.connect(host = '***', user = '***', password= '***', database="***")
        self.cursor = self.db.cursor()
        self.login_username = login_username
        self.data = data
     #provides the login screen where the user is asked for an existing username and password
    def login(self):
        self.login_window = customtkinter.CTk()
        self.login_window.geometry('400x400')
        self.login_username_entry = customtkinter.CTkEntry(self.login_window, placeholder_text ='Enter Your Username')
        self.login_username_entry.pack(pady=30)
        self.login_username = self.login_username_entry.get() 
        self.login_password_entry = customtkinter.CTkEntry(self.login_window, placeholder_text ='Enter Your Password')
        self.login_password_entry.pack(pady=30)
        self.login_password = self.login_password_entry.get()
        self.log_user_in_button = customtkinter.CTkButton(self.login_window, text = 'Login', command = self.log_user_in).pack(pady=30)
        self.reg_button = customtkinter.CTkButton(self.login_window, text = 'Register New User', command = self.reg_user).pack(pady=20)
        self.login_window.mainloop()

    #Logs the user in
    def log_user_in(self):
        import HabitTracker as HT
        self.habit = HT.HabitTracker(main_window=' ', sorting_options= ' ', sort= ' ', login= ' ')
        self.cursor.execute('SELECT username AND password, COUNT(*) FROM users WHERE username=%s AND password=%s GROUP BY username',(self.login_username_entry.get(), self.login_password_entry.get()))
        self.cursor.fetchall()
        self.row_count = self.cursor.rowcount
        if self.row_count == 1:
            self.cursor.execute('SELECT userID FROM users WHERE username=%s AND password=%s',(self.login_username_entry.get(), self.login_password_entry.get()))
            self.data = self.cursor.fetchone()
            print(self.data)
            self.user_id = self.data[0]
            self.habit.main_menu()
        else:
            self.my_label = customtkinter.CTkLabel(self.login_window, text = "User Not Found. Please Try Again.", font=('Helvetica', 10)).pack(pady=10)


login_reg = LoginOrReg(db = " ", cursor=" ", login_username= ' ', data = ' ')
login_reg.login_or_reg(root=" ")

这是我想运行的第一个文件。它运行良好,直到我输入有效的用户名和密码,然后当我单击登录时,它会重新运行该文件。我认为它根本不运行 Log_user_in 方法,因为“print(self.data)”代码行没有出现在终端中。

下面是我要运行的第二个文件(即 HabitTracker)的片段。|| |此 HabitTracker 类位于名为 HabitTracker 的文件中。

from tkinter import *
import mysql.connector
import customtkinter
import math
from datetime import datetime 
class HabitTracker:
    def __init__(self, main_window, sorting_options, sort, login) -> None:
        self.main_window = main_window 
        self.db = mysql.connector.connect(host = '***', user = '***', password= '***', database="***")
        self.cursor = self.db.cursor()
        self.sorting_options = sorting_options
        self.sort = sort 
        self.login = login
        
    def main_menu(self):
        import LoginOrReg as LR
        self.login = LR.LoginOrReg(db=' ', cursor= ' ', login_username=' ', data= ' ')
        self.date = datetime.today()
        self.main_window = customtkinter.CTk()
        self.main_window.geometry('1080x720')
        self.sorting_options = ['Daily', 'Weekly', 'Monthly', 'Highest Streak',]
        self.mylabel = customtkinter.CTkLabel(self.main_window, text='Welcome {}'.format(self.login.login_username), font=('Arial', 40)).pack(pady=5)
        self.sort = customtkinter.CTkComboBox(self.main_window, values= self.sorting_options, command= sort_by.sort_by)
        self.sort.set('Sort By')
        self.sort.pack(pady=10)
        self.create_new_habit_button = customtkinter.CTkButton(self.main_window, text='Create New Habit', command=create_habit.create_habit, fg_color='green').pack(pady=20)
        self.cursor.execute('SELECT habit_name FROM habit WHERE user_id=%s GROUP BY habit_name', (self.login.data))
        self.habits = self.cursor.fetchall()
        self.j = 0
        for j in self.habits:
            self.habit_button = customtkinter.CTkButton(self.main_window, text=self.habits[self.j], command=lambda k = self.habits[self.j]: edit_habit.edit_habit(k))
            self.habit_button.pack(pady=10)
            self.j = self.j + 1
        self.main_window.mainloop()  

This HabitTracker class is in the file called HabitTracker.


问题在于试图在应用程序中以一种会导致问题的非传统方式导入和实例化类。让我们分解一下如何正确执行此操作,以及如何构建代码以获得更好的组织。

理解问题

  • 循环导入: 当两个模块尝试相互导入时,就会发生循环导入。在的情况下, LoginOrReg 尝试导入 HabitTracker ,而 HabitTracker 尝试导入 LoginOrReg 。这会造成一个循环,Python 不知道如何解决。
  • 不必要的实例化: 在彼此的类方法中创建 HabitTracker LoginOrReg 的新实例。这没有必要,会导致意外行为。理想情况下,希望每个应用程序实例只有一个每个类。

解决方案

  1. 重构: 更好的方法是创建一个单独的文件来管理的应用程序流程和实例化:

```python # main.py import tkinter as tk import customtkinter from LoginOrReg import LoginOrReg from HabitTracker import HabitTracker

class App: def init (self): self.root = tk.Tk() self.root.withdraw() # initially hide the root window

       # Create instances of your classes 
       self.login_manager = LoginOrReg(self) 
       self.habit_tracker = HabitTracker(self)

       # Start with the login screen
       self.login_manager.login()

       self.root.mainloop()

if name == " main ": app = App() ```

  1. 修改的类:

```python # LoginOrReg.py import customtkinter

class LoginOrReg: def init (self, app): self.app = app # Store reference to the main app # ... your database connection (replace placeholders) self.db = mysql.connector.connect(host=' ', user=' ', password=' ', database=" ") self.cursor = self.db.cursor()

   def login(self):
       # ... your login window code ...

   def log_user_in(self):
       # ... your login logic ...

       if self.row_count == 1:
           # ... fetch user data ...
           self.app.habit_tracker.user_id = self.user_id
           self.app.habit_tracker.main_menu() 
           self.login_window.destroy()  # Close login window
       else:
           # ... handle invalid login ...

```

```python # HabitTracker.py import customtkinter

class HabitTracker: def init (self, app): self.app = app # Store reference to the main app self.user_id = None # ... your database connection (replace placeholders) self.db = mysql.connector.connect(host=' ', user=' ', password=' ', database=" ") self.cursor = self.db.cursor()

   def main_menu(self):
       if self.user_id is None:
           # Handle the case where the user is not logged in. 
           # Maybe show an error message.
           return

       self.main_window = customtkinter.CTk()
       # ... (rest of your main_menu code)

```

解释

  • main.py
  • 此文件现在控制的应用程序流程。
  • 它首先实例化 LoginOrReg HabitTracker
  • 然后它调用 login_manager.login() 开始登录流程。
  • LoginOrReg.py
  • LoginOrReg 类现在接收 app 实例作为参数。这允许它访问和控制其他部分,例如 HabitTracker
  • 成功登录后,它会调用 app.habit_tracker.main_menu() 并关闭登录窗口。
  • HabitTracker.py
    • HabitTracker 类也接收 app 实例作为参数。
    • 现在有一个 user_id 属性,该属性在成功登录后由 LoginOrReg 类设置。

如何运行:

  1. 将修改后的代码保存为三个文件: main.py LoginOrReg.py HabitTracker.py
  2. 从的终端运行 python main.py

这提供了一种更清晰、更有条理的方式来管理的 Python GUI 应用程序中的类和应用程序流。

标签:python,file,oop,methods
From: 78792248

相关文章

  • 如何在Mac电脑上安装Python 2
    Python是一种高级编程语言,广泛应用于数据科学、网络开发、人工智能等领域。本文将介绍如何在Mac电脑上安装Python2,帮助初学者快速入门。一、下载Python2安装包在Python官网上下载Python2的安装包,网址为https://www.python.org/downloads/release/python-2718/ 。下载完......
  • 我的 python 抓取数据是空的,不确定我的代码出了什么问题
    我的结果是空的,不确定我的代码出了什么问题:这里是我的代码:#尝试从该网站获取数据https://www.watsons.com.sg/health/c/2100000?currentPage=1importrequestsfrombs4importBeautifulSoupimportpandasaspd#Settingdisplayoptionsforpandaspd.......
  • Chrome 浏览器更新后,我的 python tagui 代码工作不稳定。问题的解决方法是什么
    我编写了一个pythontagui脚本来在chrome中操作Intranet网页。它运行良好。但是在chrome浏览器更新后,脚本每次都会在某个时刻随机停止,并且也不会抛出错误。请帮忙。我尝试重新启动电脑,但这并没有解决问题。Chrome浏览器更新后,TagUI脚本工作不稳定的问题可能由以......
  • 如何从另一个文件运行 python 文件
    我正在尝试从另一个名为LoginOrReg的文件运行一个名为HabitTracker的python文件,但是当我这样做时,它会重新运行LoginOrReg文件。我已经尝试过这个classLoginOrReg:def__init__(self,db,cursor,login_username,data):self.db=mysql.connector.......
  • Python的字典和集合
    一、字典1.定义字典字典和列表虽然类似,但是字典是无序的可变序列,并且可以像查字典一样去查找。字典的元素都是成对出现的,每个元素都是由冒号“:”和键值对(“:”左边的称为键或者Key,“:”右边的称为值或者Value)构成的,用“{}”标识,元素之间用逗号“‘,”分隔。字典的键必须是唯一......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • python cobs协议编解码算法demo
    1.SummaryCOBS(ConsistentOverheadByteStuffing)是一种算法,直译为一致的开销字节填充。简而言之,无论数据包的内容如何,都能通过产生高效可靠明确的数据包帧,从而使接受端能够从损坏的包中恢复。通常使用0x00来作为数据包的分隔符,即切割数据包的片分隔符。当使用0x00作为......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......
  • python flask允许跨域
    flask接口支持跨域设置方法在Flask中,可以通过安装flask-cors扩展来支持跨域请求。下面是使用flask-cors扩展的示例代码:fromflaskimportFlaskfromflask_corsimportCORS#ipinstallflask-corsapp=Flask(__name__)CORS(app)可以通过CORS扩展的origins参数......
  • Makefile知识点总结(Linux下开发Risc-V单片机实例)
    Makefile会不会写makefile,从一个侧面决定一个人是否具备完成大型工程的能力。Makefile和make命令一起配合使用,为什么要使用makefile,原因以及优点在下文解释。简单辨析一下建立工程的三种方式Makefile使用非常广泛,通用性强,可跨平台但是语法比较严格,写一个通用,便于管理......