导入 tkinter 文件时,我应该将啥参数传递给“root”?

Posted

技术标签:

【中文标题】导入 tkinter 文件时,我应该将啥参数传递给“root”?【英文标题】:What argument should I be passing to "root" when importing a tkinter file?导入 tkinter 文件时,我应该将什么参数传递给“root”? 【发布时间】:2018-08-21 04:28:45 【问题描述】:

这可能是一个非常基本的问题,但我目前正在尝试编写一些对 Python 知之甚少的东西。

我正在编写一个脚本,它将打开一个 GUI(在 PAGE 中设计,可与 tkinter 一起使用)供用户输入多个输入。当他们单击提交时,代码会将输入中的值存储为变量并破坏 GUI 窗口。此时,它开始运行 Selenium 脚本(在 Katalon IDE 中创建)来控制浏览器窗口并开始使用输入中的信息来填充 Web 表单中的字段。

我的 tkinter 文件包含一个用于 GUI 的主文件,该文件输入一个支持文件,该文件定义按下按钮时会发生什么。现在我将主 GUI tkinter 文件导入到 Selenium 脚本文件,然后在文件底部运行:

if __name__ == "__main__":
SNinput.create_New_Toplevel(root)
unittest.main()

我正在传递 root,因为我的主 tkinter 文件 (SNinput.py) 包含此函数:

def create_New_Toplevel(root, *args, **kwargs):
'''Starting point when module is imported by another program.'''
global w, w_win, rt
rt = root
w = Toplevel (root)
top = New_Toplevel (w)
SNinput_support.init(w, top, *args, **kwargs)
return (w, top)

当我运行 Selenium 文件时,我得到一个 TypeError,它缺少一个位置参数:'root'。我错过了什么?我应该向该函数传递什么?

或者,我是否应该颠倒这个过程,因为我想先启动 GUI,然后才运行 Selenium 脚本?换句话说,将 Selenium 脚本 (servicenow.py) 导入到 SNinput.py 中,然后在我单击提交按钮时找到运行该文件的方法?我没有这样做的原因是我看不到将这些变量传递给被调用函数的方法。

编辑: 我已经尝试在我的 servicenow.py 文件中传递 'tkinter' 的几个变体来代替 root,但每次我都收到未定义名称的错误。

在我的 servicenow.py 的顶部,我导入了 GUI 模块:

import SNinput

在GUI模块SNinput.py中,初始导入和函数定义如下:

import sys

try:
    from Tkinter import *
except ImportError:
    from tkinter import *

try:
    import ttk
    py3 = False
except ImportError:
    import tkinter.ttk as ttk
    py3 = True

import SNinput_support

def vp_start_gui():
    '''Starting point when module is the main routine.'''
    global val, w, root
    root = Tk()
    top = New_Toplevel (root)
    SNinput_support.init(root, top)
    root.mainloop()

w = None
def create_New_Toplevel(root, *args, **kwargs):
    '''Starting point when module is imported by another program.'''
    global w, w_win, rt
    rt = root
    w = Toplevel (root)
    top = New_Toplevel (w)
    SNinput_support.init(w, top, *args, **kwargs)
    return (w, top)

def destroy_New_Toplevel():
    global w
    w.destroy()
    w = None

【问题讨论】:

【参考方案1】:

当以模块化方式编写时,哪个脚本驱动另一个脚本并不重要。我个人更喜欢让 GUI 导入其他脚本。

如果我们假设第一个代码 sn-p 是正确缩进的,并且它在某种程度上是整个脚本,那么错误是很自然的,因为 root 本身没有任何意义。必须先给它分配一个对象,它才会有意义。

通过查看您的create_New_Toplevel,您似乎应该传递tkinter.Tk 类的实例。将“主要”替换为:

if __name__ == "__main__":
    import tkinter # replace with Tkinter if python 2.x
    SNinput.create_New_Toplevel(tkinter.Tk())
unittest.main()

【讨论】:

传递 tkinter.Tk() 时出现错误“未定义名称 'tkinter'”。我已经尝试了一些变化,但每次都得到相同的东西。另外,如果我将 GUI 模块作为 Selenium 模块 (servicenow.py),我将如何将变量传递给它? @Mknerr 你有什么版本的python?你跳过导入行了吗? Python 3.6.4。在 servicenow.py 文件的顶部,我有“import SNinput”,这是运行 GUI 的另一个模块。在该模块中有: import sys try: from Tkinter import * except ImportError: from tkinter import * try: import ttk py3 =​​ False except ImportError: import tkinter.ttk as ttk py3 =​​ True import SNinput_support 我已经更新了初始帖子中的信息。无论我通过什么代替根,我仍然会收到名称未定义的错误。 @Nae @Mknerr 你自己试过Tk() 吗?如SNinput.create_New_Toplevel(Tk())

以上是关于导入 tkinter 文件时,我应该将啥参数传递给“root”?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将啥作为参数传递给期望 NSError** 的方法?

我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)

如何使用 ShellExecute 从 VBScript 将参数传递给批处理文件 [重复]

在 AzureML 中部署模型时如何将参数传递给评分文件

是否可以将关键字参数传递给 Django % url % 模板标签?关键字参数值应该来自 html 标签

如何将参数传递给 erlang os:cmd()?