1

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

1 回答 1

1

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

如果我们假设第一个代码片段是正确缩进的,并且它在某种程度上是整个脚本,那么错误是很自然的,因为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()
于 2018-03-13T05:55:35.020 回答