Home > Net >  dynamically rename tkinter window
dynamically rename tkinter window

Time:11-29

I have the following bits of code that creates a toplevel window and parses a dictionary into a Text widget:

def escrito(**kwargs):
    write_window = Toplevel(root)
    #write_window.title(kwargs) (problematic code)
    writing_box = tk.Text(write_window, font = ("calibri", 20), width  = 60, height = 15, wrap=WORD)
    writing_box.pack(expand = tk.YES, fill = tk.X)
    writing_box.grid(row = 0, column = 0, sticky = 'nswe')
    texto = '\n'.join(key   ":\n"   value for key, value in kwargs.items())
    writing_box.insert("1.0", texto)

def septic_osteo():
    escrito(**infections.Septic_arthritis)
Septic_arthritis = {
'Empirical Treatment':
'Flucloxacillin 2g IV 6-hourly',
'If non-severe penicillin allergy':
'Ceftriaxone IV 2g ONCE daily',
'If severe penicillin allergy OR if known to be colonised with 
MRSA':
'Vancomycin infusion IV, Refer to  Vancomycin Prescribing 
Policy',
'If systemic signs of sepsis': 'Discuss with Consultant 
Microbiologist'
}

So when I run the code, the escrito functions parses the dictionary and writes its content onto a text widget contained on a Toplevel window. What I would like to know is how to dynamically rename the Toplevel window with the dicitonary's name. I do know that I can do this:

def septic_osteo():
    escrito(**infections.Septic_arthritis)
    write_window.title('Septic_arthritis)

but I do have like 100 functions like the one above, so, aside from labour intensive, I am not sure is the more pythonic way, so, is there a way that the window can be renamed with the dictionary name? (i.e. 'Septic_arthritis) Thanks

CodePudding user response:

If your data is in an object named infections, with attributes such as Septic_arthritis, the most straight-forward solution is to pass the data and the attribute as separate arguments, and then use getattr to get the data for the particular infection.

It would look something like this:

def escrito(data, infection):

    write_window = Toplevel(root)
    write_window.title(infection)
    writing_box = tk.Text(write_window, font = ("calibri", 20), width  = 60, height = 15, wrap="word")
    writing_box.pack(expand = tk.YES, fill = tk.X)
    writing_box.grid(row = 0, column = 0, sticky = 'nswe')
    texto = '\n'.join(key   ":\n"   value for key, value in getattr(data, infection).items())
    writing_box.insert("1.0", texto)

The important bit about the above code is that it uses getattr(data, infection) to get the data for the given infection.

If you want to create a button to call this function, it might look something like this:

button = tk.Button(..., command=lambda: escrito(infections, "Septic_arthritis"))

This will call the command escrito with two arguments: the object that contains all of the infections, and the key to the specific piece of information you want to display.

  • Related