Python Forum
[Tkinter] changing and getting value through button - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: GUI (https://python-forum.io/forum-10.html)
+--- Thread: [Tkinter] changing and getting value through button (/thread-34711.html)



changing and getting value through button - niski1996 - Aug-24-2021

Hi
I have two moduls named First:
import  tkinter as tk

from Second import ManualNodes

class CC:
    def __init__(self):
        root = tk.Tk()
        root.minsize(300, 300)
        tmp = ManualNodes(4, root=root)
        print(tmp.get_forc())
        root.mainloop()

x=CC()
and Second:
import numpy as np
import  tkinter as tk


class ManualNodes:

    def __init__(self, row_num, root):
        self.row_num = row_num
        self.forces_table = np.zeros([self.row_num, 3])
        self.root = root
        self.toplevel_dialog = tk.Toplevel(self.root)
        self.toplevel_dialog.transient(self.root)
        self.tkinter_menu()

    def get_forc(self):
        return self.forces_table


    def tkinter_menu(self):
        n = 0
        lbx = tk.Label(master=self.toplevel_dialog, text='X forces')
        lbx.grid(row=0, column=1)
        lby = tk.Label(master=self.toplevel_dialog, text='Y forces')
        lby.grid(row=0, column=2)
        lbz = tk.Label(master=self.toplevel_dialog, text='Z forces')
        lbz.grid(row=0, column=3)
        mrow = None
        for mrow in range(self.row_num):
            lb = tk.Label(master=self.toplevel_dialog, text='węzeł numer {}'.format(n))
            lb.grid(row=n + 1, column=0)
            n += 1
            for mcol in range(3):
                en = tk.Entry(master=self.toplevel_dialog)
                en.grid(row=mrow + 1, column=mcol + 1)
                en.insert(0, '0')
        accept = tk.Button(master=self.toplevel_dialog, text="accept", command=self.accept_but)
        accept.grid(row=mrow + 2, column=0, columnspan=4)


    def accept_but(self):
        for key in self.toplevel_dialog.children:
            if str(type(self.toplevel_dialog.children[key])) == '<class \'tkinter.Entry\'>':
                row = self.toplevel_dialog.children[key].grid_info()['row']
                col = self.toplevel_dialog.children[key].grid_info()['column']
                self.forces_table[row - 1][col - 1] = float(self.toplevel_dialog.children[key].get())
        self.toplevel_dialog.destroy()
when I First i get output:
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
I need that tmp.get return value wchich i input through accept button. If possible i prefer not to edit First script.


RE: changing and getting value through button - deanhystad - Aug-24-2021

First is the errant code. The buttons don't appear until you call "root.mainloop()". Printing tmp.get_force() before this means you are printing the initial values. You need to wait until after you press the "Accept" button to print the modified variables.

Unfortunately the only way you can do the printing from First is to wait until the the root window is closed. This ends root.mainloop()
root = tk.Tk()
root.minsize(300, 300)
tmp = ManualNodes(4, root=root)
# print(tmp.get_forc())  Window not visible yet
root.mainloop()
print(tmp.get_forc())



RE: changing and getting value through button - niski1996 - Aug-24-2021

Ok, thanks for help and quick answer Smile