【问题标题】:Extra tk window showing in odd situation在奇怪的情况下显示额外的 tk 窗口
【发布时间】: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 的脚本在其他领域被广泛使用,所以我更愿意将它们分开。如果我必须去上课和顶级,我会凑合。试图避免这种情况。

标签: python tkinter


【解决方案1】:

尝试将创建根窗口的代码放入函数中并让它们返回变量。然后你必须修改你的其他函数才能使用这些变量。

def initialize():
    o_window = lf2Tk()
    username = StringVar()
    password = StringVar()
    return o_window, username, password

def close_dialog(o_window):
    o_window.destroy()
...
def initialize():
    rb_window = rbTK()
    v = IntVar()
    return rb_window, v

def validate(v):
    #Display the value of the selected option for debugging purposes
    value = v.get()
    return (value)
...

然后在你的主脚本中:

def oracle_connection():
    #Get Oracle UserID and password
    o_window, username, password = lf.initialize()
    uidpass_list = lf.uidpassform(o_window, username, password)

    #Create the connection
    try:
        oracle_conn = cx_Oracle.connect(uidpass_list[0], uidpass_list[1], 'robanner', encoding='UTF-8')
    except:

    return oracle_conn
...

【讨论】:

  • 我想我遗漏了一些明显的东西。我很抱歉。我做了你建议的改变,至少乍一看,它似乎有效。在第一个 tkinter 代码中,我还必须将按钮更改为 #login button Button(o_window, text="Connect", command=close_dialog(o_window)).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()) 但是当我这样做时,它要么不会t 关闭表单表示无法调用按钮,因为应用程序已被销毁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多