Python Forum
function in new window (tkinter)
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
function in new window (tkinter)
#1
Hi I'm new to python
I'm trying to create a widget that performs a calculation on clicking a button, only I want the function to open in a new window. can anyone help me please? as you can see I've put the function into button 1 but I don't know how to open it in a new window.
Thanks

import tkinter
from colorama import Fore, Back
import math
u = 3 #underlay
f = 2.5 #fitting
import sys
import os
from tkinter import *
    


    
       

    

master=tkinter.Tk()
master.title("Carpet shop")
master.geometry("400x500")
master.configure(bg='peach puff')


def callback():
    w = float(input('carpet width:'))
    l = float(input('carpet length:'))
    p = float(input('carpet price:'))
        

    p1 = w*l*p #carpet only
    p4 = max(30,(w*l*f)) #fitting
    p2 = w*l*p + max(30,(w*l*f)) #carpet and fitting
    p3 = w*l*p + max(30,(w*l*f)) + w*l*u #carpet underlay and fitting
    p5 = w*l*p + max(30,(w*l*f)) + w*l*u + 10 #carpet, underlay, grips and fitting
    
    print( 'carpet only:£'"%.2f"%(p1))
    print( 'fitting:£'"%.2f"%(p4))
    print( 'carpet and fitting:£'"%.2f"%(p2))
    print( 'carpet, underlay and fitting:£'"%.2f"%(p3))
    print( 'carpet, underlay, grips and fitting:£'"%.2f"%(p5))
    print( '********************************************')
button1=tkinter.Button(master, text="Carpet (rooms)",width=20,height=5,highlightbackground='red',bd=5, fg='red',command = callback)
button1.grid(row=1,column=3)


        

button2=tkinter.Button(master, text="Carpet (stairs)",width=20,height=5,highlightbackground='red',bd=5, fg='red')
button2.grid(row=3,column=3)

button3=tkinter.Button(master, text="Vinyl",width=20,height=5,highlightbackground='red',bd=5, fg='blue')
button3.grid(row=5,column=3)

button4=tkinter.Button(master, text="Laminate (area)",width=20,height=5,highlightbackground='red',bd=5, fg='green')
button4.grid(row=7,column=3)

button5=tkinter.Button(master, text="Laminate (rooms)",width=20,height=5,highlightbackground='red',bd=5, fg='green')
button5.grid(row=9,column=3)

master.mainloop()
Reply
#2
Or do I need to create another frame and add it to the command for the button?
Any help would be appreciated thanks.
Reply
#3
you can use toplevel. If you only want the window around until a process is finished, you can destroy the window upon exit.

FYI: If you don't have a copy of the tkinter reference manual, you can get a copy here: http://reu.cct.lsu.edu/documents/Python_...kinter.pdf
Reply
#4
Hi Larz60
Thanks for your help and the PDF you provided. I've had a go with the top level and it creates a new window but i can't run the function in the window. Can you tell me where I'm going wrong please? Thanks.

def createNewWindow():
    newWindow = tk.Toplevel(master)
    newWindow.geometry("350x350")
    newWindow.title("Carpet (rooms)")

def callback():
    w = float(input('carpet width:'))
    l = float(input('carpet length:'))
    p = float(input('carpet price:'))
        

    p1 = w*l*p #carpet only
    p4 = max(30,(w*l*f)) #fitting
    p2 = w*l*p + max(30,(w*l*f)) #carpet and fitting
    p3 = w*l*p + max(30,(w*l*f)) + w*l*u #carpet underlay and fitting
    p5 = w*l*p + max(30,(w*l*f)) + w*l*u + 10 #carpet, underlay, grips and fitting
    
    print( 'carpet only:£'"%.2f"%(p1))
    print( 'fitting:£'"%.2f"%(p4))
    print( 'carpet and fitting:£'"%.2f"%(p2))
    print( 'carpet, underlay and fitting:£'"%.2f"%(p3))
    print( 'carpet, underlay, grips and fitting:£'"%.2f"%(p5))
    print( '********************************************')
    
button1=tkinter.Button(master, text="Carpet (rooms)",width=20,height=5,highlightbackground='red',bd=5, fg='red', command = lambda: [createNewWindow(), callback()])
                       
button1.grid(row=1,column=3)
Reply
#5
Please provide runnable code.
This should be relatively easy to do if using classes.
More difficult because of scope outside of class, because newWindow is not visible outside of the createNewWindow function.

You can make it global, but that's ugly and frowned upon.
Reply
#6
Ok sorry this is my full code. It opens a new window but the function is on the output and NOT in the new window. Not sure about the class, can you show me?

import tkinter
from colorama import Fore, Back
import math
import sys
import os
from tkinter import *
    


    
master = tkinter.Tk()
master.title("Carpet shop")
master.geometry("400x500")
master.configure(bg='peach puff')

def createNewWindow():
    newWindow = tk.Toplevel(master)
    newWindow.geometry("350x350")
    newWindow.title("Carpet (rooms)")

def callback():
    w = float(input('carpet width:'))
    l = float(input('carpet length:'))
    p = float(input('carpet price:'))
    u = 3 #underlay
    f = 2.5 #fitting
        

    p1 = w*l*p #carpet only
    p4 = max(30,(w*l*f)) #fitting
    p2 = w*l*p + max(30,(w*l*f)) #carpet and fitting
    p3 = w*l*p + max(30,(w*l*f)) + w*l*u #carpet underlay and fitting
    p5 = w*l*p + max(30,(w*l*f)) + w*l*u + 10 #carpet, underlay, grips and fitting
    
    print( 'carpet only:£'"%.2f"%(p1))
    print( 'fitting:£'"%.2f"%(p4))
    print( 'carpet and fitting:£'"%.2f"%(p2))
    print( 'carpet, underlay and fitting:£'"%.2f"%(p3))
    print( 'carpet, underlay, grips and fitting:£'"%.2f"%(p5))
    print( '********************************************')
    
button1=tkinter.Button(master, text="Carpet (rooms)",width=20,height=5,highlightbackground='red',bd=5, fg='red', command = lambda:[createNewWindow(), callback()])
                       
button1.grid(row=1,column=3)


        

button2=tkinter.Button(master, text="Carpet (stairs)",width=20,height=5,highlightbackground='red',bd=5, fg='red')
button2.grid(row=3,column=3)

button3=tkinter.Button(master, text="Vinyl",width=20,height=5,highlightbackground='red',bd=5, fg='blue')
button3.grid(row=5,column=3)

button4=tkinter.Button(master, text="Laminate (area)",width=20,height=5,highlightbackground='red',bd=5, fg='green')
button4.grid(row=7,column=3)

button5=tkinter.Button(master, text="Laminate (rooms)",width=20,height=5,highlightbackground='red',bd=5, fg='green')
button5.grid(row=9,column=3)

master.mainloop()
Reply
#7
I removed everything not needed to draw a new window for entering info to carpet a room.
You cannot use input to get info from this window or print to write to this window. You will have to create tk controls to do that stuff.
from tkinter import *

master = Tk()
master.title("Carpet shop")
 
def carpetRooms():
    newWindow = Toplevel(master)
    newWindow.geometry("350x350")
    newWindow.title("Carpet (rooms)")
    # Add code here to create Entries and labels and buttons
    # to enter the info needed to carpet a room.
     
Button(master, text="Carpet (rooms)", command = carpetRooms).grid(row=1,column=3)
 
master.mainloop()
You should avoid using pop-up windows when possible. Take a look at the tk notebook control which is a tabbed interface with multiple pages. You could replace your buttons with tabs, and the notebook pages take the place of your pop-up windows. This is the "approved" best way to make a GUI application with multiple views. I think the main reason for this is you can jump between views easily, maybe for reference or maybe cutting and pasting. This is tough to do if you have a pop-up view that goes away when another view is selected. And if you allow multiple pop-ups at the same time the screen gets cluttered.
Reply
#8
Thank you
I take a look at the tk notebook and see if I can run it with tabs. I'll let you know how it goes.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Interaction between Matplotlib window, Python prompt and TKinter window NorbertMoussy 3 344 Mar-17-2024, 09:37 AM
Last Post: deanhystad
  Using Tkinter inside function not working Ensaimadeta 5 4,861 Dec-03-2023, 01:50 PM
Last Post: deanhystad
  Tkinter multiple windows in the same window tomro91 1 788 Oct-30-2023, 02:59 PM
Last Post: Larz60+
  Centering and adding a push button to a grid window, TKinter Edward_ 15 4,387 May-25-2023, 07:37 PM
Last Post: deanhystad
  [Tkinter] Open tkinter colorchooser at toplevel (so I can select/focus on either window) tabreturn 4 1,831 Jul-06-2022, 01:03 PM
Last Post: deanhystad
  Tkinter won't run my simple function AthertonH 6 3,743 May-03-2022, 02:33 PM
Last Post: deanhystad
  [Tkinter] Background inactivity timer when tkinter window is not active DBox 4 2,866 Apr-16-2022, 04:04 PM
Last Post: DBox
  why my list changes to a string as I move to another window in tkinter? pymn 4 2,547 Feb-17-2022, 07:02 AM
Last Post: pymn
  [Tkinter] tkinter best way to pass parameters to a function Pedroski55 3 4,737 Nov-17-2021, 03:21 AM
Last Post: deanhystad
  [Tkinter] Tkinter Window Has no Title Bar gw1500se 4 2,795 Nov-07-2021, 05:14 PM
Last Post: gw1500se

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020