Попытка создать систему регистрации электронной почты, но массив остается пустым - PullRequest
0 голосов
/ 18 февраля 2020

Итак, я пытаюсь создать какую-то систему журналов электронной почты, предварительно просматривая тему и сообщение в каждой строке, например, gmail.

В mainWindowScript.py у меня есть кнопка «Создать», которая добавляет строка в массив в getLogs.py и кнопка 'logs', которая запускает getLogs.py с помощью модуля os. В getLogs.py у меня просто есть ListBox. Я использовал tkinter для создания кнопок и listboxes.

Когда я запускаю mainWindowScript.py, он сначала открывает listbox, созданный в getLogs.py, что не должно происходить. Но странная часть заключается в том, что когда я закрываю это окно и нажимаю кнопку «Создать», список, к которому я пытался добавить, все еще пуст, в результате чего listbox становится пустым.

Это действительно сбивает с толку, мне нужна помощь.

Вот mainWindowScript.py:

import tkinter as tk
from tkinter import ttk
import os

import getLogs as gl

mainWin = tk.Tk()

canvas = tk.Canvas(mainWin, width = 400, height = 400)
canvas.pack()

frame = tk.Frame(mainWin, bg = "gray")
frame.place(relx = 0, rely = 0, relwidth = 1, relheight = 1)


def compose():
    gl.tos.append("isybgf")
    #os.system("python email_gui.py")            #run another python file


def getEmailLogs():
    os.system("python getLogs.py")


composeButton = tk.Button(frame, bg = "blue", fg = "white", text = "COMPOSE", command = compose)
composeButton.place(relx = 0.3, rely = 0.2, relwidth = 0.4, relheight = 0.2)

logsButton = tk.Button(frame, bg = "blue", fg = "white", text = "LOGS", command = getEmailLogs)
logsButton.place(relx = 0.3, rely = 0.5, relwidth = 0.4, relheight = 0.2)

mainWin.mainloop()

И getLogs.py:

import tkinter as tk

mainWind = tk.Tk()

canvas = tk.Canvas(mainWind, width = 400, height = 600)
canvas.pack()

frame = tk.Frame(mainWind, bg = "gray")
frame.place(relx = 0, rely = 0, relwidth = 1, relheight = 1)

mailLogs = tk.Listbox(frame)
mailLogs.place(relx = 0.1, rely = 0.05, relwidth = 0.8, relheight = 0.9)

tos = []
subjects = []
messages = []

print(tos)

mails = {
    "to:": tos,
    "subject:": subjects,
    "message:": messages
}

for i in range(0, len(tos)):
    emailLogTitle = "{}: {} - {}".format(mails["to:"][i], mails["subject:"][i], mails["message:"][i])
    mailLogs.insert('end', emailLogTitle)

mainWind.mainloop()

1 Ответ

0 голосов
/ 18 февраля 2020

Используя os.system(), вы запускаете отдельную программу, которая не имеет доступа к данным, созданным в текущей программе. Поскольку вы импортируете getLogs, вы должны поместить код в функцию, чтобы выполнить его без os.system()

getLogs.py

import tkinter as tk

tos = []
subjects = []
messages = []

def log_window():

    #mainWind = tk.Tk()
    mainWind = tk.Toplevel()

    canvas = tk.Canvas(mainWind, width = 400, height = 600)
    canvas.pack()

    frame = tk.Frame(mainWind, bg = "gray")
    frame.place(relx = 0, rely = 0, relwidth = 1, relheight = 1)

    mailLogs = tk.Listbox(frame)
    mailLogs.place(relx = 0.1, rely = 0.05, relwidth = 0.8, relheight = 0.9)

    print(tos)

    mails = {
        "to:": tos,
        "subject:": subjects,
        "message:": messages
    }

    for i in range(0, len(tos)):
        emailLogTitle = "{}: {} - {}".format(mails["to:"][i], mails["subject:"][i], mails["message:"][i])
        mailLogs.insert('end', emailLogTitle)

    #mainWind.mainloop()

И теперь вы можете выполнить его

def getEmailLogs():
    gl.log_window()

и он будет иметь доступ к значениям в tos


Поскольку оба windows работают в одной и той же программе, поэтому секунда не нуждается в mainloop() и она должна быть создана Toplevel(), не Tk()


Кстати: composer добавлял только tos, поэтому в более позднем словаре mail не было ни тем, ни сообщений. Вы можете создать один список с письмами вместо отдельного списка для to, subject, message


mai.py

import tkinter as tk
import os

import getLogs as gl

# --- functions ---

def compose():
    gl.tos.append("isybgf")
    gl.subjects.append("isybgf")
    gl.messages.append("isybgf")
    # it could be better to keep it in one list ie.
    # mails.append( {'to': "isybgf", 'subject': "isybgf", 'message': "isybgf" } )

def getEmailLogs():
    gl.log_window()

# --- main ---

mainWin = tk.Tk()

canvas = tk.Canvas(mainWin, width=400, height=400)
canvas.pack()

frame = tk.Frame(mainWin, bg="gray")
frame.place(relx = 0, rely = 0, relwidth = 1, relheight = 1)

composeButton = tk.Button(frame, bg="blue", fg="white", text="COMPOSE", command=compose)
composeButton.place(relx=0.3, rely=0.2, relwidth=0.4, relheight=0.2)

logsButton = tk.Button(frame, bg="blue", fg="white", text="LOGS", command=getEmailLogs)
logsButton.place(relx=0.3, rely=0.5, relwidth=0.4, relheight=0.2)

mainWin.mainloop()

РЕДАКТИРОВАТЬ: Версия с другими изменениями - сокращены до важных элементов. Я держу письма в одном списке mails в основной программе и отправляю в журнал в качестве аргумента.

main.py

import tkinter as tk
import getLogs as gl

# --- functions ---

def compose():
    mails.append( {'to': "user@domain.com", 'subject': "Read it", 'message': "Hello World!"} )

def get_email_logs():
    gl.log_window(mails)

# --- main --- (lower_case_names)

mails = []

main_window = tk.Tk()

compose_button = tk.Button(main_window, text="COMPOSE", command=compose)
compose_button.pack(fill='x')

logs_button = tk.Button(main_window, text="LOGS", command=get_email_logs)
logs_button.pack(fill='x')

close_button = tk.Button(main_window, text="CLOSE", command=main_window.destroy)
close_button.pack(fill='x')

main_window.mainloop()

getLogs.py

import tkinter as tk

def log_window(mails):

    window = tk.Toplevel()

    mail_logs = tk.Listbox(window)
    mail_logs.pack(fill='both', expand=True)

    close_button = tk.Button(window, text="CLOSE", command=window.destroy)
    close_button.pack(fill='x')

    for item in mails:
        mail_logs.insert('end', "{}: {} - {}".format( item["to"], item["subject"], item["message"] ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...