如何让我的独立GUI模块在我当前的主模块中运行完成

  • 本文关键字:模块 运行 独立 GUI python tkinter
  • 更新时间 :
  • 英文 :


我正在开发一个用于构建布局工作的python应用程序。它基本上包含点,最终应该允许您从这些点获得信息和计算。其中一个功能应该使用单独的模块从文本文件上传点,如果任何点已经保存,请要求用户输入新的点名称,然后继续询问,只要他们继续不输入唯一的点名称。我的程序适用于重复点,但在您退出主窗口之前,不会从第二个GUI显示第二个重复点的弹出窗口。我已经花了好几个小时重做了,我就是搞不明白。我非常感谢任何帮助和批评。我是新手,所以我确信这一切都是一团糟。

主要桂码:

import tkinter as tk
import point_importer
import csv
from tkinter import Toplevel, ttk, TOP, BOTTOM
from tkinter import filedialog as fd
from point_importer import import_points 
from datetime import datetime
import tkinter.font as font
import pickle

filename = ''
current_azimuth = 0
point_dict = {}
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Survey Amateur')
self.state('zoomed')
self.resizable(False, False)
self.columnconfigure((0,1), weight=1, uniform='column')
self.rowconfigure(2, weight=0)
self.main_buttons()

def clear_window(self):
for widget in self.winfo_children():
widget.destroy()
def main_buttons(self):
self.clear_window()
label_text = ttk.Label(self, text='Survey Amateur', font = ('helvetica', 44))
label_text.grid(column=0, row=0, padx=10, pady=50, ipadx=0, columnspan=2)
file_button = tk.Button(self, text='File', font = ('helvetica', 30), bg='grey82')
file_button['command'] = self.file_window
file_button.grid(column=0, row=2, padx=10, pady=50, ipadx=98, sticky='N')
setting_button = tk.Button(self, text='Settings', font=('helvetica', 30), bg='grey82')
setting_button.grid(column=1, row=2, padx=10, pady=50, ipadx=48, sticky='N')
backsite_button = tk.Button(self, text='Set Backsite', font=('helvetica', 30), bg='grey82')
backsite_button['command'] = self.backsite_window
backsite_button.grid(column=0, row=3, padx=10, pady=50, sticky='N')
stakeout_button = tk.Button(self, text='Stakeout', font=('helvetica', 30), bg='grey82')
stakeout_button.grid(column=1, row=3, padx=10, pady=50, ipadx=40, sticky='N')
empty_label = ttk.Label(self, text='', font='helvetica36')
empty_label.grid(column=0, row=4, columnspan=2)

def file_window(self):
self.clear_window()
label_text = ttk.Label(self, text='File', font=('helvetica', 44))
label_text.grid(column=0, row=0, padx=10, pady=50, ipadx=0, columnspan=2)
back_button = tk.Button(self, text='Back', font=('helvetica', 10))
back_button['command'] = self.main_buttons
back_button.grid(column=0, row=1, padx=10, pady=50, ipadx=0, sticky='N')
open_button = tk.Button(self, text='Open', font=('helvetica', 30), bg='grey82')
open_button['command'] = self.open_file
open_button.grid(column=1, row=2, padx=10, pady=50, ipadx=0, sticky='N')
new_button = tk.Button(self, text='New', font=('helvetica', 30), bg='grey82')
new_button['command'] = self.new_file
new_button.grid(column=0, row=2, padx=10, pady=50, sticky='N')
export_button = tk.Button(self, text='Export', font=('helvetica', 30), bg='grey82')
export_button.grid(column=1, row=3, padx=10, pady=50, sticky='N')
import_button = tk.Button(self, text='Import', font=('helvetica', 30), bg='grey82')
import_button['command'] = self.import_points
import_button.grid(column=0, row=3, padx=10, pady=50, ipadx=0, sticky='N')
empty_label = ttk.Label(self, text='', font='helvetica36')
empty_label.grid(column=0, row=5, columnspan=2)
def backsite_window(self):
occupy_point = ''
foresite_point = ''
self.clear_window()
label_text = ttk.Label(self, text='Set Backsite', font=('helvetica', 44))
label_text.grid(column=0, row=0, padx=10, pady=50, ipadx=0, columnspan=2)
Occupy_point_entry = ttk.Entry(self, textvariable=occupy_point, text='Back', font=('helvetica', 10))
Occupy_point_entry.grid(column=0, row=1, padx=10, pady=50, ipadx=0, sticky='N')
foresite_point_entry = ttk.Entry(self, textvariable=foresite_point, text='Open', font=('helvetica', 30), bg='grey82')
foresite_point_entry.grid(column=1, row=1, padx=10, pady=50, ipadx=0, sticky='N')
ts_height_entry = ttk.Entry(self, text='New', font=('helvetica', 30), bg='grey82')
ts_height_entry.grid(column=0, row=2, padx=10, pady=50, sticky='N')
rod_height_entry = ttk.Entry(self, text='New', font=('helvetica', 30), bg='grey82')
rod_height_entry.grid(column=1, row=2, padx=10, pady=50, sticky='N')
empty_label = ttk.Label(self, text='', font='helvetica36')
empty_label.grid(column=0, row=5, columnspan=2)
def open_file(self):
global filename 
filename = fd.askopenfilename(
initialdir=r'C:UsersTimDesktopCodePythonSurveying_Program',
title='Browse',
filetype = (('text files', '*.txt'), ("all files","*.*"))
)
def save_file(self):
with open(filename, 'wb') as f:
pickle.dump(point_dict, f)

def new_file(self):
global filename 
filename = fd.asksaveasfilename(
initialdir=r'C:UsersTimDesktopCodePythonSurveying_Program',
title = 'Save As',
filetype = (('text files', '*.txt'), ("all files","*.*"))
)
open(filename + '.txt', 'w')
self.save_file()
def import_points(self):
global point_dict
import_file = fd.asksaveasfilename(
initialdir=r'C:UsersTimDesktopCodePythonSurveying_Program',
title = 'Import File',
filetype = (('text files', '*.txt'), ("all files","*.*"))
)
point_dict = point_importer.import_points(import_file, point_dict)
print(point_dict)
self.save_file()

if __name__ == "__main__":

app = App()
app.mainloop()

独立点上传模块:

import tkinter as tk
import csv
from datetime import datetime
from tkinter import BOTTOM, TOP, ttk

def get_new_point_name(old_point_name):
global entry_box
global root

root = tk.Tk()
root.title('Error')
window_width = 600
window_height = 300
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
center_x = int(screen_width/2 - window_width / 2)
center_y = int(screen_height/2 - window_height / 2)
root.geometry(f'{window_width}x{window_height}+{center_x}+{center_y}')
label_text = f'There is already a point with the name {old_point_name}. Please enter a new point name:'
new_point_label = tk.Label(root, text=label_text, font = ('helvetica', 10))
new_point_label.grid(row=0, column=0, ipadx=10, ipady=10)

entry_box = tk.Entry(root)
entry_box.grid(row=1, column=0, ipadx=10, ipady=10)
enter_button = tk.Button(root, text='Enter', command=get_entry)
enter_button.grid(row=2, column=0, ipadx=10, ipady=10)
root.mainloop()
def get_entry():
global new_point_name
new_point_name = entry_box.get()
if new_point_name in my_dict.keys():
#root.destroy()
get_new_point_name(new_point_name)
else:
root.destroy()
return new_point_name
def import_points(file_location, point_dict):
global my_dict
my_dict = point_dict
now = datetime.now()
with open(file_location, newline='') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
point_list = list(csv_reader)
for item in point_list:
if item[0] in point_dict.keys():
get_new_point_name(item[0])
print(new_point_name)
item[0] = new_point_name
point_info_dict = {}
point_info_dict['northing'] = float(item[1])
point_info_dict['easting'] = float(item[2])
point_info_dict['elevation'] = float(item[3])
point_info_dict['description'] = item[4]
point_info_dict['time'] = now.strftime('%H:%M:%S')
point_info_dict['date'] = now.strftime('%m/%d/%Y')
point_dict[item[0]] = point_info_dict
return point_dict 

首先是一些一般提示

  • 导入您需要的内容
  • 当您打算使用整个模块时,请将其导入一次,并坚持导入的方式
  • 查看PEP 8风格指南
    • 行长度以及如何分割代码行
  • 对代码的逻辑块进行分组,例如构造和布局
  • 在同一代码块中多次写入同一代码时,请注意:

一定有更好的方法!

  • 如果事情变得超级复杂,比如ipadx,同样的情况也适用
  • 不要每次都删除和构建新的小部件,而是取消映射和映射它们:
    • pack_forgetgrid_forget可以帮助您解决问题,框架也有帮助

main.py

import tkinter as tk
import point_importer
class App(tk.Tk):
def __init__(self):
super().__init__()
self.title('Survey Amateur')
self.state('zoomed')
self.resizable(False, False)
btncon = {
'font'  : ('helvetica', 30),
'bg'    : 'grey82',
'width' : 11}
btnlay = {
'padx'  : 10,
'pady'  : 50,
'sticky': 'N'}
#construction
file_button = tk.Button(
self, text='File', command=self.import_points, **btncon)
#layout
file_button.grid(
column=0, row=2, **btnlay)
def import_points(self):
point_dict = point_importer.get_new_point_name('path', dict())
if __name__ == "__main__":
app = App()
app.mainloop()

point_importer.py

import tkinter as tk
def get_new_point_name(path, cnf):
root = tk.Toplevel()
cnf.update(
{'x' : 100,
'y' : 100
})
return cnf

解释为什么此代码有效而您的代码无效

当您触发函数import_points时,您将创建一个Tk的新实例。Tk不仅仅是一个小部件,它还是一个特殊的顶层,它与tcl解释器以及将由该解释器创建的所有死者的根一起提供。为了接收用户的输入并向操作系统的窗口管理器发送请求,解释器会运行一个事件循环,直到用户、程序或窗口管理器决定会话需要结束。

TL;DR:

因此,作为事件循环的mainloop是会话结束之前的不归路点。如果您需要额外的窗口,请使用Toplevel

最新更新