I want to know how to get input from Tkinter and put it into a variable like a phone number or a piece of text.
from tkinter import *
def show_data():
print( 'My First and Last Name are %s %s' % (fname.get(), lname.get()) )
win = Tk()
Label( win, text='First Name' ).grid( row=0 )
Label( win, text='Last Name' ).grid( row=1 )
fname = Entry( win )
lname = Entry( win )
fname.grid( row=0, column=1 )
lname.grid( row=1, column=1 )
Button( win, text='Exit', command=win.quit ).grid( row=3, column=0, sticky=W, pady=4 )
Button( win, text='Show', command=show_data ).grid( row=3, column=1, sticky=W, pady=4 )
mainloop()
Maybe this can help you:
from tkinter import *
def get_variable_value():
valueresult.set( strlname.get() + ' ' + strfname.get() ) #assign val variable to other
print(valueresult.get()) #if you want see the result in the console
root = Tk()
strfname = StringVar()
strlname = StringVar()
valueresult = StringVar()
labelf = Label(root, text = 'First Name').pack()
fname = Entry(root, justify='left', textvariable = strfname).pack() #strlname get input
labell = Label(root, text = 'Last Name').pack()
lname = Entry(root, justify='left', textvariable = strlname).pack() #strfname get input
button = Button(root, text='Show', command=get_variable_value).pack()
res = Entry(root, justify='left', textvariable = valueresult).pack() #only to show result
root.mainloop()
You haven't provided any code but you could try:
class GetPhoneNbr(object):
def __init__(self):
self.root = Tk.Tk()
self.label = Tk.Label(self.root, text="Enter phone number")
self.label.pack()
self.phoneNbr = Tk.StringVar() # <- here's what you need
Tk.Entry(self.root, textvariable=self.phoneNbr).pack()
NOTE: This is a stub of code, not the entire class definition.
Below is a minimal GUI that puts what's written in an entry to a variable, which is the button's text:
import tkinter as tk
def replace_btn_text():
b['text'] = e.get()
root = tk.Tk()
e = tk.Entry(root)
b = tk.Button(root, text="Replace me!", command=replace_btn_text)
e.pack()
b.pack()
root.mainloop()
Same example but with an OOP structure:
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
self._create_widgets()
self._display_widgets()
def replace_btn_text(self):
""" Replaces button's text with what's written in the entry.
"""
# self._e.get() returns what's written in the
self._b['text'] = self._e.get() # entry as a string, can be assigned to a var.
def _create_widgets(self):
self._e = tk.Entry(self)
self._b = tk.Button(self, text="Replace me!", command=self.replace_btn_text)
def _display_widgets(self):
self._e.pack()
self._b.pack()
if __name__ == '__main__':
root = App()
root.mainloop()
Related
from tkinter import *
window = Tk()
window.geometry("600x400+400+250")
window.title('Expenses Tracker')
class ExpensesTrack:
row_list = []
list_box = []
dict1 = dict()
def __init__(self,master):
self.title1 = Label(window, padx=15, pady=8, text='Enter the item').grid(row=0, column=0)
self.title_price = Label(window, padx=8, pady=8, text='Enter the price').grid(row=1, column=0)
self.entry1 = Entry(window, font='NEWTIMESROMAN')
self.entry1.grid(row=0, column=1)
self.entry2 = Entry(window, font='NEWTIMESROMAN')
self.entry2.grid(row=1, column=1)
self.blank1 = Label(window).grid(row=3, column=1, columnspan=3)
self.title3 = Label(window, text='Name of Item').grid(row=4, column=1 )
self.title4 = Label(window, text='Price').grid(row=4, column=2)
self.button1 = Button(window, text='Add', command= self.buttonclick).grid(row=1, column=4, padx=20)
self.button2 = Button(window, text='Remove' )
self.button2.grid(row=5, column=4, padx=15)
def buttonclick(self):
var = IntVar()
def cmd():
i = var.get()
print(i)
row = len(self.row_list) + 5
name = Label(window, text=self.entry1.get())
price = Label(window, text="$" + self.entry2.get())
box = Checkbutton(window ,variable= var, command= cmd)
name.grid(row= row, column=1)
price.grid(row= row, column=2)
box.grid(row=row, column=0)
self.row_list.append(len(self.row_list) + 5)
self.list_box.append(box)
self.dict1[row] = price, name
self.entry1.delete(0, END)
self.entry2.delete(0, END)
e = ExpensesTrack(window)
window.mainloop()
''' I make a list of box when every time , I add check button. I want to use destroy function iterate from the list_box. but I don't know how to check value of var , it is 1 or 0 for respective check button and later, I would add name and price label with it. Can any one tell a way that how to get var value from the box from list_box or any other way.
e = ExpensesTrack(window)
window.mainloop()
to remove items you shoud nav by var
list_var = []
# self.button2 = Button(window, text='Remove', command=self.remove )
def remove(self):
for i, var in enumerate(self.list_var):
if var.get() == 1:
self.list_box[i].destroy()
self.dict1[i][0].destroy()
self.dict1[i][1].destroy()
def buttonclick(self):
var = IntVar()
row = len(self.row_list) + 5
name = Label(window, text=self.entry1.get())
price = Label(window, text="$" + self.entry2.get())
box = Checkbutton(window ,variable= var)
name.grid(row= row, column=1)
price.grid(row= row, column=2)
box.grid(row=row, column=0)
self.dict1[len(self.row_list)] = price, name
self.row_list.append(len(self.row_list) + 5)
self.list_box.append(box)
self.list_var.append(var)
self.entry1.delete(0, END)
self.entry2.delete(0, END)
I have 2 different python GUI menus in 2 different scripts.
A dropdown list to select
A menu where numbers can be input and output at the same GUI
I want to merge these 2 together so that both appear in the same GUI menu.
I am having trouble doing it because the structure in both python scripts is different.
Please advice.
Sharing both scripts below:
1st one
from tkinter import *
class Custombox:
def __init__(self, title, text):
self.title = title
self.text = text
def store():
self.new = self.entry.get() # storing data from entry box onto variable
if self.new == '50': # checking
a.change('ACCEPTED') # changing text
elif self.new == '40':
a.change('Increase frequency') # else, changing text
else:
a.change('Decrease frequency') # else, changing text
self.win = Toplevel()
self.win.title(self.title)
# self.win.geometry('400x150')
self.win.wm_attributes('-topmost', True)
self.label = Label(self.win, text=self.text)
self.label.grid(row=0, column=0, pady=(20, 10), columnspan=3, sticky='w', padx=10)
self.l = Label(self.win)
self.entry = Entry(self.win, width=50)
self.entry.grid(row=1, column=1, columnspan=2, padx=10)
self.b1 = Button(self.win, text='Attack', width=10, command=store)
self.b1.grid(row=3, column=1, pady=10)
# self.b2 = Button(self.win, text='Cancel', width=10, command=self.win.destroy)
# self.b2.grid(row=3, column=2, pady=10)
def __str__(self):
return str(self.new)
def change(self, ran_text):
self.l.config(text=ran_text, font=(0, 12))
self.l.grid(row=2, column=1, columnspan=3, sticky='nsew', pady=5)
root = Tk()
root.withdraw()
a = Custombox('User learning platform', 'Select the frequency of the victim sensor.')
root.mainloop()
2nd one
from tkinter import *
root = Tk()
root.title("GUI platform")
# Add a grid
mainframe = Frame(root)
mainframe.grid(column=0,row=0, sticky=(N,W,E,S) )
mainframe.columnconfigure(0, weight = 1)
mainframe.rowconfigure(0, weight = 1)
mainframe.pack(pady = 100, padx = 100)
# Create a Tkinter variable
tkvar = StringVar(root)
# Dictionary with options
choices = { 'URM37','HC-SR04','SRF05','Parallax PING'}
tkvar.set('') # set the default option
popupMenu = OptionMenu(mainframe, tkvar, *choices)
Label(mainframe, text="Please select the type of Sensor for attack").grid(row = 1, column = 1)
popupMenu.grid(row = 2, column =1)
# on change dropdown value
def change_dropdown(*args):
if tkvar.get() == 'HC-SR04':
print( "Correct" )
else:
print("WRONG")
# link function to change dropdown
tkvar.trace('w', change_dropdown)
root.mainloop()
I am totally new to tkinter. I am trying to pass data between two windows. There is a button on root window. button press will open a top level. There are two entry fields and a submit button in on toplevel window. user can enter two number and submit. What i am trying to achieve is, pressing submit button should close the top level and result (sum) should be shown in the root window. How to pass entry field data to root window?
from tkinter import *
root= Tk()
root.geometry('600x400')
sum_var= StringVar()
def entry_Fn():
level_1 = Toplevel(root)
Label( level_1, text = "level one").pack()
entry_1 =Entry(level_1)
entry_1.pack()
entry_2 =Entry(level_1)
entry_2.pack()
Button(level_1, text= "submit", command= submitBtn ).pack()
def submitBtn():
val_1= entry_1.get()
val_2= entry_2.get()
sum_var.set(int(val_1)+ int(val_2))
Label(root, text = "Main window").pack()
Button(root, text= "To enter Data", command= entry_Fn).pack()
sum = Label(root, textvariable = sum_var)
sum.pack()
root.mainloop()
#result
val_1= entry_1.get()
NameError: name 'entry_1' is not defined
#shall I define some global variables?
In this case, you don't have to declare global. Simply indent your submitBtn function inside entry_Fn:
def entry_Fn():
level_1 = Toplevel(root)
Label( level_1, text = "level one").pack()
entry_1 = Entry(level_1)
entry_1.pack()
entry_2 = Entry(level_1)
entry_2.pack()
def submitBtn():
val_1= entry_1.get()
val_2= entry_2.get()
sum_var.set(int(val_1)+ int(val_2))
level_1.destroy()
Button(level_1, text= "submit", command=submitBtn).pack()
But generally it is easier to make a class so you can avoid this kind of scope problems, like below:
from tkinter import *
class GUI(Tk):
def __init__(self):
super().__init__()
self.geometry('600x400')
self.sum_var= StringVar()
Label(self, text="Main window").pack()
Button(self, text="To enter Data", command=self.entry_Fn).pack()
sum = Label(self, textvariable=self.sum_var)
sum.pack()
def entry_Fn(self):
self.level_1 = Toplevel(self)
Label(self.level_1, text = "level one").pack()
self.entry_1 = Entry(self.level_1)
self.entry_1.pack()
self.entry_2 = Entry(self.level_1)
self.entry_2.pack()
Button(self.level_1, text="submit", command=self.submitBtn).pack()
def submitBtn(self):
val_1 = self.entry_1.get()
val_2 = self.entry_2.get()
self.sum_var.set(int(val_1)+ int(val_2))
self.level_1.destroy()
root = GUI()
root.mainloop()
For your case, you can simply pass the two entries to submitBtn() function:
def submitBtn(entry_1, entry_2):
....
Then update the command= for the submit button inside entry_Fn():
Button(level_1, text="submit", command=lambda: submitBtn(entry_1, enter_2)).pack()
You can subclass tk.TopLevel, and use a tk.IntVar to transfer the data back to root:
import tkinter as tk
class EntryForm(tk.Toplevel):
def __init__(self, master, sum_var):
super().__init__(master)
tk.Label(self, text="level one").pack()
self.sum_var = sum_var
self.entry_1 = tk.Entry(self)
self.entry_1.pack()
self.entry_2 = tk.Entry(self)
self.entry_2.pack()
tk.Button(self, text="submit", command=self.submitBtn).pack()
def submitBtn(self):
val_1 = self.entry_1.get()
val_2 = self.entry_2.get()
self.sum_var.set(int(val_1) + int(val_2))
self.destroy()
def spawn_entry_popup():
EntryForm(root, sum_var)
root= tk.Tk()
root.geometry('600x400')
sum_var = tk.IntVar()
tk.Label(root, text = "Main window").pack()
tk.Button(root, text= "To enter Data", command=spawn_entry_popup).pack()
sum_label = tk.Label(root, textvariable=sum_var)
sum_label.pack()
root.mainloop()
You can also place your app inside a class:
import tkinter as tk
class EntryForm(tk.Toplevel):
def __init__(self, master, sum_var):
super().__init__(master)
tk.Label(self, text="level one").pack()
self.sum_var = sum_var
self.entry_1 = tk.Entry(self)
self.entry_1.pack()
self.entry_2 = tk.Entry(self)
self.entry_2.pack()
tk.Button(self, text="submit", command=self.submitBtn).pack()
def submitBtn(self):
val_1 = self.entry_1.get()
val_2 = self.entry_2.get()
self.sum_var.set(int(val_1) + int(val_2))
class GUI(tk.Tk):
def __init__(self):
super().__init__()
self.geometry('600x400')
self.sum_var = tk.IntVar()
tk.Label(self, text = "Main window").pack()
tk.Button(self, text= "To enter Data", command=self.spawn_entry_popup).pack()
sum_label = tk.Label(self, textvariable=self.sum_var)
sum_label.pack()
def spawn_entry_popup(self):
EntryForm(self, self.sum_var)
GUI().mainloop()
I am struggling with this small application. I fallowed many forum and answer but I couldn't find the right answer.
I marked in the code the problems I am having:
The first problem is I could not find a way for output the results in a ttk entry widget.
The second problem is how to execute different code depending on the radiobutton checked.
The third problem is how can I make the program with better syntax?
Code:
from tkinter import ttk
from tkinter import *
from tkinter import messagebox
class main_window:
def __init__(self, master = None):
self.frame1 = ttk.Frame(master)
self.frame1.pack()
master.title('Calculation program')
master.resizable(False, False)
master.configure(background='blue')
self.radiob1 = ttk.Radiobutton(self.frame1, value="M", text="Molar (M)")
self.radiob1.grid(column=0, row=1, sticky="nw", padx=25)
self.radiob2 = ttk.Radiobutton(self.frame1, value="mM", text="milliMolar (mM)")
self.radiob2.grid(column=0, row=2, sticky="nw", padx=25)
self.mol_weight = ttk.Entry(self.frame1, width=24, font=('Arial', 10))
self.mol_weight.grid(row=0, column=3, padx=3, pady=5)
self.amount = ttk.Entry(self.frame1, width=24, font=('Arial', 10))
self.amount.grid(row=1, column=3, padx=3, pady=5)
self.results = ttk.Entry(self.frame1, width=15, font=('Cambria', 10))
self.results.grid(row=6, column=3, padx=5, pady=5)
ttk.Label(self.frame1, text='Molecular Weight:').grid(row=0, column=1, padx=0, pady=3, sticky='w')
ttk.Label(self.frame1, text='Amount:').grid(row=1, column=1, padx=0, pady=3, sticky='w')
ttk.Label(self.frame1, text='Results').grid(row=5, column=3, padx=0, pady=6, sticky='s')
ttk.Button(self.frame1, text='Calculate',
command=self.calculate).grid(row=4, column=0, padx=5, pady=5, sticky='e')
ttk.Button(self.frame1, text='Clear',
command=self.clear).grid(row=4, column=1, padx=5, pady=5, sticky='w')
def calculate(self):
if self.radiob1.SELECTED??:
return self.molare()
elif self.radiob2.SELECTED??:
return self.millimolar
else:
messagebox.showinfo(title="No good, you have to select one!")
messagebox.showinfo(title='Calculations', message='Calculations Completed!')
def molare(self):
a = self.mol_weight.get()
b = self.amount.get()
ans = a + b
self.results["Results"] = "Is: " + ans [???]
def millimolar(self):
a = self.mol_weight.get()
b = self.amount.get()
ans = a - b
self.results["Results"] = "Is: " + ans [???]
def clear(self):
self.mol_weight.delete(0, 'end')
self.amount.delete(0, 'end')
self.radiob1.DESELECT() ??
self.radiob2.DESELECT()??
def main():
root = Tk()
Main_window = main_window(root)
root.mainloop()
if __name__ == "__main__":
main()
1) To put text in an Entry widget, use the insert method:
entry.delete(0, "end") # clear entry
entry.insert(0, "my text") # insert new text
2) Associate a StringVar with your radiobuttons and use its get method to know which button is selected
import tkinter as tk
from tkinter import ttk
def callback():
if var.get() == "r1":
print("r1 is selected")
elif var.get() == "r2":
print("r2 is selected")
else:
print("None")
root = tk.Tk()
var = tk.StringVar(root, value="")
ttk.Radiobutton(root, variable=var, value="r1", text="r1").pack()
ttk.Radiobutton(root, variable=var, value="r2", text="r2").pack()
ttk.Button(root, text="print", command=callback).pack()
root.mainloop()
To clear the radiobutton selection, you can do var.set("").
3) It's a rather subjective question. First, class name are usually capitalized. Personally, I make my Main class inherit from tk.Tk:
class Main(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
# window configuration
self.title('Calculation program')
#...
# widgets
ttk.Label(self, text="example").grid()
#...
self.mainloop()
if __name__ == "__main__":
Main()
And, as it was said in the comments, a and b should be converted to float or int before making calculations and then do "Is %d" % ans or any of the other proposition of furas in the comments.
I recommend you this website: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html to get the list of all options and methods of each tkinter/ttk widget.
I wish to print from a list where the user enters an input and then has that input printed from a list. This however doesn't work without a blank string in the list as it says that the list is too short for the data to be shown in a label. I want for this to have the input printed immediately after pressing the continue button not after pressing the next button.
from tkinter import *
class Traveller:
def __init__(self, parent):
self.names = [""]
self.E_phone = "f"
self.E_name = "q"
self.count = 0
self.go = Frame(parent, width=500, height=450, bg="snow", pady=30, padx=10)
self.go.grid(row=1, column=0)
self.go.grid_propagate(0) # to reserve space required for frame
self.dataView = Frame(parent, width=500, height=500, bg="snow", pady=30, padx=10)
name = Label(self.go, text="Name:", bg="snow")
name.grid(row=1, column=0, sticky=E)
self.E_name = Entry(self.go, width=40)
self.E_name.grid(row=1, column=1, sticky=W, pady=4)
menuButton = Button(self.go, text="Continue", command=self.dataSave)
menuButton.grid(row=2, column=1, pady=4)
dataTitle = Label(self.dataView, text="Here is all of the inputted data:", bg="snow")
dataTitle.grid(row=2, column=0)
dataExit = Button(self.dataView, text="Return", command=self.returnT)
dataExit.grid(row=1, column=0, pady=5)
nextData = Button(self.dataView, text="Next", command=self.NData)
nextData.grid(row=4, column=0, pady=5)
prevData = Button(self.dataView, text="Previous", command=self.PData)
prevData.grid(row=4, column=1, pady=5)
self.everything = Label(self.dataView, text="The person" + self.names[self.count], bg = "snow")
self.everything.grid(row=3, column = 0)
def dataSave(self):
self.names.append(self.E_name.get())
self.go.grid_remove()
self.dataView.grid(row=1, column=0)
self.dataView.grid_propagate(0)
# clearing the entry boxes
self.E_name.delete(0, END)
def returnT(self):
self.dataView.grid_remove()
self.go.grid(row=1, column=0)
self.go.grid_propagate(0)
def NData(self):
self.count = self.count + 1
self.everything.configure(text = "The person " + self.names[self.count])
def PData(self):
if self.count >= 1:
self.count = self.count - 1
self.everything.configure(text = "The person " + self.names[self.count])
# main routine
if __name__ == "__main__":
root = Tk()
root.title("Traveller Details")
play = Traveller(root)
root.geometry("500x450+0+0")
root.mainloop()