【发布时间】:2020-03-11 00:26:59
【问题描述】:
这是我的第一个问题,所以要温柔!
情况: 我有两个脚本,每个脚本都使用 tkinter 来提示一些信息。它们是分开的,因为有时我需要一个,有时我需要两个。
我还有一个主脚本,它导入两个 tkinter 脚本并调用它们。
当我单独运行每个 tkinter,或者从没有导入其他脚本的主脚本运行时,它工作正常。当我导入两个脚本时,会弹出一个空白的 tkinter (title = "tk") 窗口。
问题: 1. 这是什么原因造成的? 2.如何防止弹出那个愚蠢的窗口? 3. 是否有一种自动方式来查看该额外窗口并在它显示时将其终止?
我做了什么:
- 用 Google 搜索我的小伙伴们
- 重命名 Tk 导入,因此每个脚本都有自己的实例
- 我的头撞在桌子上
代码: uidpassform(第一个直接使用 tkinter 的脚本)
from tkinter import Tk as lf2Tk
from tkinter import Label, StringVar, Entry, Button
o_window = lf2Tk()
username = StringVar()
password = StringVar()
def close_dialog():
o_window.destroy()
def uidpass form():
#Return the value of the selected option
o_window.title('Oracle Login Credentials')
#username label and text entry box
Label(o_window, text="User Name").grid(row=2, column=0,padx = 5,pady = 20)
Entry(o_window, textvariable=username).grid(row=2, column=2, padx=20)
#password label and password entry box
Label(o_window,text="Password").grid(row=3, column=0,padx = 5)
Entry(o_window, textvariable=password, show='*').grid(row=3, column=2,padx = 20)
#login button
Button(o_window, text="Connect", command=close_dialog).grid(row=4, column=3,columnspan=2, padx = 20)
Label(o_window, text="").grid(row=5)
o_window.mainloop()
print (username.get())
print (password.get())
return [username.get(), password.get()]
if __name__ == "__main__":
uidpassform()
单选按钮形式(第二个 tkinter 形式)
from tkinter import Tk as rbTK
from tkinter import Radiobutton, Button, Label, IntVar, LEFT, W
rb_window = rbTK()
v = IntVar()
def validate():
#Display the value of the selected option for debugging purposes
value = v.get()
return (value)
def close_dialog():
#Check to see if the Radiobutton has a value and if so, close the form
value = v.get()
if value == 0:
value = v.get()
else:
rb_window.destroy()
def fnradiobutton():
#Return the value of the selected option
rb_window.title("Connection")
Label(rb_window, text="Choose a Data Connection:", justify=LEFT, padx=20).grid(row=0, sticky=W)
Radiobutton(rb_window, text="Production", variable=v, value=1, command=validate).grid(row=1, padx=20, sticky=W)
Radiobutton(rb_window, text="Test", variable=v, value=2, command=validate).grid(row=2, padx=20, sticky=W)
Button(rb_window, text="Done", command=close_dialog).grid(row=3, column=2, padx=10)
Label(rb_window, text="").grid(row=4)
#print(str(V.get()) + " from fnradiobutton")
rb_window.mainloop()
return v.get()
if __name__ == "__main__":
fnradiobutton()
主脚本(调用两个 tkinter 脚本)
import cx_Oracle
import lf2 as lf
import time
import radiobutton as rb
import pyodbc
def oracle_connection():
#Get Oracle UserID and password
uidpass_list = lf.uidpassform()
#Create the connection
try:
oracle_conn = cx_Oracle.connect(uidpass_list[0], uidpass_list[1], 'robanner', encoding='UTF-8')
except:
return oracle_conn
def dbconnect(switch):
#Choose the proper connection, based on the radiobutton form
if switch == 1:
connection = pyodbc.connect('DSN=PCard_Production;Trusted_Connection=yes;')
else:
connection = pyodbc.connect('DSN=PCardTest;Trusted_Connection=yes;')
return connection
def run_script():
start = time.time()
oracle_conn = oracle_connection()
swich = rb.fnradiobutton()
conn = dbconnect(swich)
if __name__ =='__main__':
# This is the summary spot
run_script()
【问题讨论】:
-
不要使用多个 tkinter 应用程序作为导入,而是将它们编写为顶层窗口,该窗口采用第三个脚本的根窗口。可能最好把它们写成一个类
-
这两个使用 tk 的脚本在其他领域被广泛使用,所以我更愿意将它们分开。如果我必须去上课和顶级,我会凑合。试图避免这种情况。