【问题标题】:Open Tkinter graphic form of another py file (no file, only graphic form)打开另一个py文件的Tkinter图形形式(没有文件,只有图形形式)
【发布时间】:2021-09-20 05:16:02
【问题描述】:

我有一个带有 Tkinter 图形形式(经典窗口)的主文件,例如称为 A.pymain=Tk()。另外,如果 B.py 文件位于主项目的子文件夹中,我该如何调用它?

例如,通过单击条形菜单中的“打开表单B”等项目,如何打开`B.py 的图形表单(经典窗口)? 重要提示:没有输出控制台,只有图形形式 P.S:如果请不要使用“自我”。谢谢

文件 A.PY:主要

from tkinter import *
from tkinter import ttk
import tkinter as tk

main=Tk()
main.title("xxxxxx")
main.geometry("750x750")
main.configure(bg='#282828')

#Bar Menù (no need to write all the code of bar menu)
filemenu.add_command (label = 'Open form B', command = ????)

文件 B.PY:次要

from tkinter import *
from tkinter import ttk
import tkinter as tk

secondary=Tk()
secondary.title("yyyyyyy")
secondary.geometry("750x750")
secondary.configure(bg='#282828')

编辑(代码已更新,但我不知道是否正确):

文件 A.PY:主要

from tkinter import *
from tkinter import ttk
import tkinter as tk
from b import *

main=Tk()
main.title("xxxxxx")
main.geometry("750x750")
main.configure(bg='#282828')

#Bar Menù (no need to write all the code of bar menu)
filemenu.add_command (label = 'Open form B', command = b.draw_graph)

文件 B.PY:次要

from tkinter import *
from tkinter import ttk
import tkinter as tk
from b import *

def draw_graph():
    secondary=Toplevel("home/mypc/Destkop/Folder1/Folder2/B.py/secondary)
    secondary.title("yyyyyyy")
    secondary.geometry("750x750")
    secondary.configure(bg='#282828')

上传 2(仅 B.py):

from tkinter import *
from tkinter import ttk
import tkinter as tk

def draw_graph():
    global secondary=Toplevel()
    secondary.title("yyyyyyy")
    secondary.geometry("750x750")
    secondary.configure(bg='#282828')

#combobox
comboboxx=["xxxxxx", "xxxxx"]
combobox=ttk.Combobox(secondary, width=19)
combobox.place(x=6, y=12)
combobox.config(values=comboboxx)
combobox.set("Scegli")

# I only wrote a small part of the code, showing the combobox.
# But the code is very long. I would not like to put everything 
# in the function (if that is possible) 

错误:combobox=ttk.Combobox(secondary, width=19) NameError: name 'secondary' 没有定义

【问题讨论】:

  • 您所说的“图形形式”是指窗口吗?推荐在tkinter 中打开额外窗口的原因是创建Toplevel 小部件,多次调用Tk()
  • @martineau 是的,没错,我的意思是经典窗口。你能告诉我答案吗?我是 Python 新手。谢谢:)
  • 如果您将代码保留在函数中,那么您可以决定何时在importing 之后运行它们。并且函数可以将parent作为参数,所以当你导入时你可以使用Toplevel()作为parent,当你直接运行代码时你可以使用Tk()作为parent
  • 如果您想要更好的答案,那么您必须创建更好的问题 - 不要指望我们会为您编写所有代码。您可以放置​​最少的工作代码,我们可以简单地复制和修改以创建解决方案。
  • @furas 将答案分成两个 cmets。你当然是对的。但是作为一个很简单的问题,我觉得我提供的数据已经足够了,比如main = Tk()。我是否还必须编写 main.title ("title")、main.geometry ("750x750") 和 main.configure (bg = '# 282828')?第二个窗口也一样?他们没用。我只是写了必要的数据,即第一个窗口的main.title(“标题”)和第二个窗口的secondary = Tk(),并添加了py文件的名称。

标签: python python-3.x python-2.7 user-interface tkinter


【解决方案1】:

使用 Toplevel() 函数

  1. 按照你想要的名字创建第一个文件并编写这段代码(例如a.py)
from tkinter import *
from tkinter.ttk import *
from b import *

class app:
    def __init__(self, root):
        self.root = root
        self.menu_bar()
        self.root.mainloop()

    def menu_bar(self):
        self.app = app1()
        self.menubar = Menu(self.root)
        self.filemenu = Menu(self.menubar, tearoff=0)
        self.filemenu.add_command(
            label="Open A1", command=lambda: self.app.second(self.root))
        self.filemenu.add_separator()
        self.filemenu.add_command(label="Exit", command=self.root.quit())
        self.menubar.add_cascade(label="File", menu=self.filemenu)
        self.root.config(menu=self.menubar)

if __name__ == "__main__":
    app(Tk())

  1. 并在第二个文件中确保他在 a.py(from filename import *) (例如 b.py)中写入的名称并像这样编写
class app1:
    def second(self, root):
        self.root = Toplevel(root)
        Label(self.root, text="A2").pack(padx=20, pady=20)

这应该可以解决你的问题

【讨论】:

    【解决方案2】:

    b.py 中的代码你应该保留在函数中以控制何时运行它

    b.py

    import tkinter as tk  # PEP8: `import *` is not preferred
    # in file `b.py` you don't need `import b` nor `from b import *` 
    
    
    def draw_graph():
        win = tk.Toplevel()
        label = tk.Label(win, text="GRAPH")
        label.pack() 
    

    然后你就可以import bcommand=b.draw_graph

    ma​​in.py

    (我使用Button 来创建最少的工作代码——所以每个人都可以简单地复制并运行它)

    import tkinter as tk  # PEP8: `import *` is not preferred
    import b  # PEP8: `import *` is not preferred
    
    def main():
        root = tk.Tk()  # PEP8: spaces around `=` when assigning to variable
        
        # ... code ...
        
        #filemenu.add_command(label='Open form A1', command=b.draw_graph)  # PEP8: `=` without spaces when assigning arguments
        # to use `b.draw_graph` you have to use `import b`, not `from b import *`
        
        button = tk.Button(root, text="Open form A1", command=b.draw_graph)
        button.pack() 
        
        root.mainloop()
        
    if __name__ == '__main__':    
        main()
    

    如果你会使用

    from b import * 
    

    那么您将不得不使用command=draw_graph 而不是command=b.draw_graph


    如果您在名为 other 的子文件夹中有 b.py,那么您可以这样做

    from other import b
    

    仍然使用command=b.draw_graph

    import other.b
    

    然后你必须使用command=other.b.draw_graph


    PEP 8 -- Style Guide for Python Code


    编辑:

    我已经写过如何使用子文件夹中的代码,但我重复一遍

    如果您有Folder1/main.pyFolder1/Folder2/B.py,那么您只需要在main.py

    from Folder2 import B
    
    command=B.draw_graph
    

    import Folder2.B
    
    command=Folder2.B.draw_graph
    

    (如果文件有大写名称B,那么模块也有大写名称B

    它应该可以在不向sys.path添加文件夹和不添加文件Folder2/__init__.py的情况下工作

    如果你有Folde1/main.pyFolder1/Folder2/Folder3/B.py 那么你需要

    from Folder2.Folder3 import B
    
    command=B.draw_graph
    

    import Folder2.Folder3.B
    
    command=Folder2.Folder3.B.draw_graph
    

    最终您可以在导入前将当前文件夹添加到sys.path

    import os
    import sys
    
    BASE_DIR = os.path.abspath(os.path.dirname(__file__))
    sys.path.append(BASE_DIR)
    
    from Folder2 import B
    #import Folder2.B
    

    当你从不同的文件夹运行代码时它也可以工作
    (不同的Current Working Directory - 检查print(os.getcwd())

    例如

    cd ..
    python Folder1/main.py
    

    cd /
    python /home/mypc/Destkop/Folder1/main.py
    

    【讨论】:

    • 非常感谢。谢谢sssss :) 漂亮的答案。但是如果 B.py 在子文件夹中,你忘了写如何加载它。例如,如果 main.py 在 home/mypc/Destkop/Folder1 中,而 B.py 在 home/mypc/Destkop/Folder1/Folder2/B.py 中。我怎样才能得到这个?但是,明天我很好地重写了这个问题。我写了旧的初始代码,然后单独添加UPLOAD 1,以便读者理解。然后,我当然会投票支持您的友好回复:) 如果您更改子文件夹问题的答案,我将不胜感激。谢谢,明天见
    • 我已经写过了 - from Folder2 import Bimport Folder2.B - 但我使用了名字 other 。我只是没有展示如何将Folder1 添加到sys.path 以确保当您从与Folder1 不同的文件夹运行代码时它会找到Folder2 - 即python Folder1/main.py 而不是python main.py
    • 你给我写了一个漂亮的答案。它看起来像一本书。好的!真诚的祝贺!正如我们昨天所说,现在我正在编辑我的问题。几分钟。但是我得到一个错误。我按照你说的做了,但我明白了:import b ModuleNotFoundError: No module named 'b'。我已经尝试过 import b 和 from b import *.我还更改了 command = b.draw_graph 甚至 command = draw_graph。在 A.py 和 B.py 中,我完全按照你写的那样做。为什么会出现这个错误?谢谢
    • 如果你的文件名 B.py 大写 B 那么你必须 import B 大写 B - 我也在回答中写了它。
    • 你为什么用a = tk.Toplevel ()而不是win = tk.Toplevel ()。您是否将Combobox(win, ...) 放入函数中?如果你有它在函数之外,那么它会在你导入文件时执行——所以它在你创建 win = ... 之前执行。正如我在开始时所说的那样 - 你必须将 ALL CODE 保留在函数中。 Combobox(win, ...) 必须在 win = ... 之后 顺便说一句:在我的代码中,我创建 Label(win,...) 并在 draw_graph 内部进行,win = ... 之后 - 它不能在 draw_graph 之外
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    相关资源
    最近更新 更多