Не могу написать полный текст в записи - tkinter - PullRequest
0 голосов
/ 02 июня 2018

Я работаю над программным обеспечением с графическим интерфейсом с Tkinter, которое в основном печатает общую плоскость продукта после нажатия кнопки «Создание», как вы можете видеть на следующих изображениях:

  1. Интерфейс GUI

После нажатия кнопки «Crear»

Как вы могли оценить, как только вы дадите полную информацию в записях и нажмете кнопку «Crear»,динамическая таблица (созданная с метками и записями в цикле for) отображается с размерами модулей, видимых в кадре "Esquema".У меня проблема в том, что, когда я редактирую информацию в динамической таблице, я немедленно изменяю график (что возможно благодаря методу трассировки), не давая мне закончить число, которое я уже пишу;Я имею в виду: я не могу написать полное число в записи в динамической таблице до того, как она внесет изменения в график.Итак, у меня вопрос: какую функцию или команду я могу применить, чтобы программа остановилась и снова активировалась после того, как я закончу записывать полный номер в записи в таблице?

Любая помощь будет высоко оценена,

PS: я уже попробовал функции time.stop и after.Первый сбил программу, что недопустимо, а второй увеличил время ожидания, прежде чем я смог продолжить запись чисел в таблицу.Полный код программы действительно обширный, но здесь я поделюсь исполняемым кодом:

Код

from tkinter import *
from tkinter import filedialog as fd
from tkinter import messagebox as ms
from tkinter import ttk
from io import open
import tkinter as tk
from pathlib import Path
import PIL
from PIL import Image, ImageTk
import glob
import sys
import numpy as np
import os
import os, os.path
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
import time

#Made by:
#Juan David Argüello Plata

#----------------------------------------------CLASSES AND FUNCTIONS-----------------------------------------------------
class Interface():
    def __init__(self, inter, w=860,h=700, titulo = "Example", titulo_principal = "EXAMPLE"):
        inter.title(titulo)
        inter.resizable(False, False)

        #Dimensions of the screen
        ws = inter.winfo_screenwidth() 
        hs = inter.winfo_screenheight() 

        x = (ws/2) - (w/2)
        y = (hs/2) - (h/2)

        #Position of the interface
        inter.geometry('%dx%d+%d+%d' % (w, h, x, y))

        titulo = Label(inter, text = titulo_principal, font=(fuente,24, "bold italic"))
        titulo.pack()

        self.inter = inter

        #---Frames, labels and general data---
        self.Principal_frames()
        self.subframes()
        self.Data()

        #---Actions to execute---
        Action(self)

    def Principal_frames(self):
        self.Frame_Table = Frame(self.inter)
        self.Frame_Table.config(width = "400", height = "600", bd = 2, relief = "groove")
        self.Frame_Table.place(x=10, y=50)

        titulo = Label(self.Frame_Table, text = "Data", font=(fuente,20, "bold italic"))
        titulo.place(x=180, y=5)

        self.Frame_graph = Frame(self.inter)
        self.Frame_graph.config(width = "400", height = "600", bd = 2, relief = "groove")
        self.Frame_graph.place(x=450, y=50)

        titulo = Label(self.Frame_graph, text = "Graph", font=(fuente,20, "bold italic"))
        titulo.place(x=150, y=5)

    def subframes(self):
        self.subframe_Data = Frame(self.Frame_Table)
        self.subframe_Data.config(width = "300", height = "200", bd = 2, relief = "groove")
        self.subframe_Data.place(x=80, y=50)

        self.subframe_graph = Frame(self.Frame_graph)
        self.subframe_graph.config(width = "395", height = "400", bd = 2, relief = "flat")
        self.subframe_graph.place(x=0, y=50)

    def Data(self):
        Length = Label(self.subframe_Data, text = "Length", font = Font)
        Length.grid(row=0, column = 0, sticky=W, padx=3)
        self.Length=Entry(self.subframe_Data, width=8)
        self.Length.grid(row=0,column=1, sticky=W, padx=3)
        self.Sub_Length=Entry(self.subframe_Data, width=8)
        self.Sub_Length.grid(row=0,column=2, sticky=W, padx=3)

        Width = Label(self.subframe_Data, text = "Width", font = Font)
        Width.grid(row=1, column = 0, sticky=W, padx=3)
        self.Width=Entry(self.subframe_Data, width=8)
        self.Width.grid(row=1,column=1, sticky=W, padx=3)
        self.Sub_Width=Entry(self.subframe_Data, width=8)
        self.Sub_Width.grid(row=1,column=2, sticky=W, padx=3)

class Action(Interface):
    def __init__(self, inter):
        self.Interface = inter
        self.modification = 0
        Create = Button(self.Interface.subframe_Data, text="Create", font = Font, command = self.Table)
        Create.grid(row=1,column=3)

    def Table(self):
        self.Table = Frame(self.Interface.Frame_Table)
        self.Table.config(width = "150", height = "400", bd=2, relief="groove")
        self.Table.place(x=80, y=150)

        #Dimensions of the labels and entries of the table
        Length = 176
        Width = 200

        #Reading of Data
        self.Data = np.zeros(4)
        self.Data[0] = float(self.Interface.Length.get())
        self.Data[1] = float(self.Interface.Sub_Length.get())
        self.Data[2] = float(self.Interface.Width.get())
        self.Data[3] = float(self.Interface.Sub_Width.get())

        #---Dynamic table ---
        if self.Data[1] > self.Data[3]:
            self.Max = self.Data[1]
        else:
            self.Max = self.Data[3]

        #-Variables-
        label = "label"
        Entry_length = "length"
        Entry_width = "width"
        Numbers_label = [""]*(int(self.Max)+1)
        self.width_data = [""]*(int(self.Max)+1)
        self.length_data=[""]*(int(self.Max)+1)

        self.First_Time = 0    #Counter that depends of the size of the table (help the program to recognize if it's the first time the "Create" button is pressed)
        self.Modules = np.zeros((int(self.Max),2))   #Matrix which contains the table info

        #--Scorllbar--
        self.canvas_table = Canvas(self.Table)
        self.canvas_table.pack(side="left", fill="both", expand = True)
        self.canvas_table.config(width=str(Width), height=str(Length))
        self.Frame_table = Frame(self.canvas_table)
        self.Frame_table.config(width=str(Width), height=str(Length), relief="flat")
        self.canvas_table.create_window(0,0,window= self.Frame_table, anchor = 'nw')

        self.yscroll = Scrollbar(self.Table, orient = "vertical", command = self.canvas_table.yview)
        self.yscroll.pack(side='right', fill='y')

        self.canvas_table['yscrollcommand'] = self.yscroll.set
        self.Frame_table.bind("<Configure>", self.AuxscrollFunction)
        self.yscroll.grid_forget()


        Number = Label(self.Frame_table, text="", width=4, font = Font, bd = 2, relief="groove")
        Number.grid(row=0,column=0,sticky=W)

        L = Label(self.Frame_table, text="L", width=8, font = Font, bd = 2, relief="groove")
        L.grid(row=0,column=1,sticky=W)

        Wid = Label(self.Frame_table, text="W", width=8, font = Font, bd = 2, relief="groove")
        Wid.grid(row=0,column=2,sticky=W)

        #Subdivisions (defect values)
        Wth = self.Data[2]/self.Data[3]
        l = self.Data[0]/self.Data[1]

        self.var_length = []
        self.var_width = []
        for i in range(int(self.Max)+1):
            if i != 0:
                Numbers_label[i] = label + str(i)
                Numbers_label[i] = Label(self.Frame_table, text=str(i), width=4, font = Font, bd = 2, relief="groove")
                Numbers_label[i].grid(row=i,column=0,sticky=W)

                if i <= self.Data[1]:
                    text = str(l)
                else:
                    text = "0.0"

                var_length = StringVar()
                self.var_length.append(var_length)
                self.length_data[i] = Entry_length + str(i)
                self.length_data[i] = Entry(self.Frame_table, width=9, font = Font, bd = 2, relief="groove", textvariable = self.var_length[i-1])
                self.var1 = self.length_data[i]
                self.var_length[i-1].trace("w", lambda name, index, mode, envio=self: Action.callback(envio))
                self.length_data[i].grid(row=i,column=1,sticky=W)
                self.length_data[i].insert(0, text)

                if i <= self.Data[3]:
                    text = str(Wth)
                else:
                    text = "0.0"

                var_width = StringVar()
                self.var_width.append(var_width)
                self.width_data[i] = Entry_width + str(i)
                self.width_data[i] = Entry(self.Frame_table, width=9, font = Font, bd = 2, relief="groove", textvariable = self.var_width[i-1])
                self.var1 = self.width_data[i]
                self.var_width[i-1].trace("w", lambda name, index, mode, envio=self: Action.callback(envio))
                self.width_data[i].grid(row=i,column=2,sticky=W)
                self.width_data[i].insert(0, text)


        self.yscroll.pack(side='right', fill = 'y')

    def AuxscrollFunction(self,event):
        self.canvas_table.configure(scrollregion=self.canvas_table.bbox("all"))

    def callback(self, *args):
        self.First_Time = self.First_Time+1

        if self.First_Time >= 2*int(self.Max) and self.modification == 0:
            try:
                for i in range(int(self.Max)+1):
                    if i != 0:
                        self.Modules[i-1][0] = float(self.length_data[i].get())
                        self.Modules[i-1][1] = float(self.width_data[i].get())
                self.Data[0] = 0
                self.Data[2] = 0
                for i in range(int(self.Max)):
                    self.Data[0] = self.Data[0]+self.Modules[i][0]
                    self.Data[2] = self.Data[2]+self.Modules[i][1]
                self.Interface.Length.delete(0, 'end')
                self.Interface.Width.delete(0, 'end')
                self.Interface.Length.insert(0, str(self.Data[0]))
                self.Interface.Width.insert(0, str(self.Data[2]))
                #self.var1.focus()
                self.Graph()
            except ValueError:
                pass

    def Graph(self):

        #---Area---
        f=Figure(figsize=(3,3), dpi=100)
        a=f.add_subplot(111)

        type_line = 'r--'   #Línea de borde de área
        a.plot([0,self.Data[2]], [0,0], type_line)
        a.plot([0,self.Data[2]], [self.Data[0],self.Data[0]], type_line)
        a.plot([0,0], [0,self.Data[0]], type_line)
        a.plot([self.Data[2],self.Data[2]], [0,self.Data[0]], type_line)

        canvas = FigureCanvasTkAgg(f, self.Interface.subframe_graph)
        canvas.draw()
        canvas.get_tk_widget().place(x=0,y=0)

#--------------------------------------------------------INTERFACE-----------------------------------------------
#---Beginning of the interface---
root = Tk()

#Font
fuente = "TkFixedFont"
Font = (fuente, 10)

Interface(root)


root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...