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

时间:2018-03-13 02:20:27

标签: python tkinter python-module katalon-recorder

这可能是一个非常基本的问题,但我正在尝试编写一些目前对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 个答案:

答案 0 :(得分:1)

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

如果我们假设第一个代码片段正确缩进,并且它在某种程度上是整个脚本,则错误是自然的,因为root本身没有意义。首先必须为它赋予一个对象,使其具有意义。

通过查看您的create_New_Toplevel,看起来您应该传递tkinter.Tk类的实例。替换' main'用:

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