Saving variables in n Entry widgets Tkinter interface

2024/10/12 18:40:35

Firstly apologises for the length of code but I wanted to show it all.

I have an interface that looks like this:

Table interface

When I change the third Option Menu to "List" I will add in the option to have 'n' values (not shown). I then require 'n' columns where the user can input their values.

I also have the problem where there may be 'n' amount of rows depending on a text file opened by the interface.

I am therefore wondering if it possible (as I'm having difficulties not repeating the same values in boxes and now I require 'n' columns) to add 'n' amount of rows and columns as my code shows with just adding 4 columns. I can read the amount of rows ok but have trouble returning all of these values depending on how many rows there are. So far I can do one row..

Thank you!

def numberwritten(number): fg = number.get()print fgnumbers = [StringVar() for i in xrange(4) ] #Name available in global scope. Need to add other rows?
for i in numbers: i.trace('w',lambda a,b,c,n=i: numberwritten(n) ) def ChoiceBox(choice):co_ord = str(frame_table.grid_size())col, rows = map(float, co_ord.strip('()').split(','))rows = int(rows)if choice == "Fixed":empty1.destroy()#choice_frame.grid_forget()     tkMessageBox.showinfo("Message", "No optimisation, value fixed.")elif choice == "List":column = 7for i in xrange(4): choice_title = Label(frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10) choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) boxes=[]for i in xrange(4):for j in range(2, rows): box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") # Here I'm having problems with rows box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1) boxes.append(box)box1,box2,box3,box4=boxeselif choice == "Interval" or "Optimisation":for i in xrange(2): choice_title1 = Label(frame_table, text='Min Value', bg='white', borderwidth=0)choice_title1.grid(row=0, column=column, sticky="nsew", padx=1, pady=1)choice_title2 = Label(frame_table, text='Max Value', bg='white', borderwidth=0)choice_title2.grid(row=0, column=column+1, sticky="nsew", padx=1, pady=1)boxes=[]for i in xrange(2): box=Entry(frame_table,bg='white',borderwidth=0,textvariable=numbers[i]) box.grid(row=rows+1,column=i, sticky='ew', padx=1, pady=1) boxes.append(box)box1,box2,box3,box4=boxes

UPDATE: I've advanced slightly and the section in ChoiceBox which is now under a class Window: is ChoiceBox(self, choice), I have the following section where I need to change the commented line to accept 'n' amount of boxes.

column = 7for i in xrange(self.number_boxes): choice_title = Label(self.frame_table, text='Value %g'% float(i+1), bg='white', borderwidth=0, width=10) choice_title.grid(row=1, column=column+i, sticky="nsew", padx=1, pady=1) boxes=[]for i in xrange(self.number_boxes):for j in range(2, rows): box=Entry(self.frame_table,bg='white',borderwidth=0,textvariable=numbers[i], width=10, justify="center") box.grid(row=j,column=column+i, sticky='nsew', padx=1, pady=1) boxes.append(box)#box1,box2,box3,box4=boxes

I still however then have the problem of using numberwritten including the first few lines of code in original example to completely extract a list of values, preferably for each row.

Answer

While I'm not convinced that you've found the easiest way to express your interface yet, to do what you want is relatively simple.

Conceptually, to add an entry for editing a value you have to define (and store a reference to) an object that acts as the model for the value. You then define the widget (or widgets) that will manipulate that value. Then you add such key bindings as are necessary (often none; the defaults are pretty good). Finally, you add the widget to the overall user interface (via the grid method, for example). However, this does mean that you have to design your overall code to handle a model whose size is not fixed. (Removing an entry is the reverse process, of course.)

It's a good idea to start refactoring your code into smaller pieces that do smaller pieces of this overall task. For example, write a function to just create a model, an entry widget, to add that widget to the GUI, and to return the model object. Everywhere else that needs to create such a coupled entry can then ask this expert function to do the job for them, so you can get it right, once. By breaking things up into smaller pieces with very clearly defined tasks, it becomes much easier to focus on the more complex logic aspects instead of getting bogged down with the (long, boring) details of widget management.

https://en.xdnf.cn/q/118115.html

Related Q&A

Pulling the href from a link when web scraping using Python

I am scraping from this page: https://www.pro-football-reference.com/years/2018/week_1.htmIt is a list of game scores for American Football. I want to open the link to the stats for the first game. The…

Php: Running a python script using blender from a php project using cmd commands

I need to run in cmd a python script for blender from blender and print the result from a php project, but I dont get the all result. Here is my code:$script = "C:\Users\madalina\Desktop\workspace…

Pymysql when executing Union query with %s (Parameter Placeholder)

This is the code about UNION QUERY:smith =Smithsmithb=Smithsql="""SELECT Distinct Pnumber FROM PROJECT, DEPARTMENT, EMPLOYEE WHERE Dnum = Dnumber AND Mgr_ssn=Ssn AND Lname= %s UNION SELE…

Django - Calling list or dict item using a variable in template

Im trying to call a dictionary or list object in a template using a variable in that template with no results.What Im trying to is identical to this general python code:keylist=[firstkey,secondkey,thir…

Multi-Classification NN with Keras error

I am getting an error when trying to do multi-classification with three classes. Error: TypeError: fit_generator() got multiple values for argument steps_per_epochCode Giving Error: NN.fit_generator(tr…

How to do time diff in each group on Pandas in Python

Heres the phony data:df = pd.DataFrame({email: [u1,u1,u1,u2,u2,u2],timestamp: [3, 1, 5, 11, 15, 9]})What I intend to retrieve is the time diff in each group of email. Thus, after sorting by timestamp i…

How to copy contents of a subdirectory in python

I am newbie to python, I am trying to achieve following task-I have a directory WP_Test containing a sub-directory test, I want to copy all the files and folders inside this sub-directory test to anoth…

Facing issue while providing dynamic name to file in python through a function

the line : with open(new%s.txt % intg ,a) as g : is giving error in below code. Every time I call the function "Repeat", it should create file with name new1.txt, new2.txt and so on. But it …

Python Pandas: Merging data frames on multiple conditions

I wish to merge data frames as fetched via sql under multiple condition. df1: First df contains Customer ID, Cluster ID and Customer Zone ID. The second df contain complain ID, registration number.…

counterpart to PILs Image.paste in PHP

I was asked to port a Python application to PHP (and Im not very fond of PHP).The part Im having trouble to port uses a set of monochromatic "template" images based on the wonderful Map Icons…