button placement.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
jan.b
User
Beiträge: 160
Registriert: Mittwoch 9. August 2017, 17:12

button placement.

Beitragvon jan.b » Mittwoch 24. Januar 2018, 22:07

Hallo, wie kann ich diesen button umposittionieren? und was tut mainloop(hat damit nichts zu tun. würde ich trotzdem gerne wissen.)
danke schon mal. :D


from tkinter import*
tk = Tk()

canvas = Canvas(tk, width=400, height=400)
canvas.pack()

def hi():
print("hi")
btn = Button(tk, width=20, height=30, text="hallo", fg='red', bg='black', command=hi)
btn.pack()
Benutzeravatar
__deets__
User
Beiträge: 2137
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: button placement.

Beitragvon __deets__ » Mittwoch 24. Januar 2018, 22:20

Lange nicht mehr da gewesen - immer noch nicht gelernt, Code in die Codebox zu stecken.... :roll:

Was deine mainloop Frage angeht: diese Thema wird ganz akut hier im Tkinter Forum diskutiert. In das dein Posting übrigens auch gehört.

Und ohne zu wissen wie das Ergebnis aussehen soll, kann man deine Hauptfrage auch nicht beantworten.
jan.b
User
Beiträge: 160
Registriert: Mittwoch 9. August 2017, 17:12

Re: button placement.

Beitragvon jan.b » Mittwoch 24. Januar 2018, 22:25

ok. das Ergebnis soll sein, dass ich weiß, wie man buttons platziert. also wäre eine dementsprechende antwort nett. :lol:
Benutzeravatar
__deets__
User
Beiträge: 2137
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: button placement.

Beitragvon __deets__ » Mittwoch 24. Januar 2018, 22:42

Du hast also wirklich kein einziges Beispiel im großen weiten Internet gefunden, in dem Buttons platziert werden? Und auch nicht hier im Forum, in dem zB Wuf permanent so etwas postet? Da bleibt nur der Schluss, das du weder Hände noch Augen hast, womit es ja dann auch egal ist, ob du einen Button platziert bekommst, ist ja eh nicht sicht- und benutzbar für dich :twisted:
jan.b
User
Beiträge: 160
Registriert: Mittwoch 9. August 2017, 17:12

Re: button placement.

Beitragvon jan.b » Mittwoch 24. Januar 2018, 22:43

harter diss. leider nicht hilfreich aber trotzdem hart.
Benutzeravatar
__deets__
User
Beiträge: 2137
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: button placement.

Beitragvon __deets__ » Mittwoch 24. Januar 2018, 23:09

Doch doch, hilfreich war der schon. Du bist halt ein bisschen sehr ignorant den dir gegebene Tipps gegenüber. Selbst in dem “harten Diss” habe ich dir erzählt, wie du an Beispiele kommst. Und Erklärungen.

Wenn du jemanden suchst, der dir auf hingerotzte zwei Sätze einen interaktiven Roman mit Tonspur & Glitzerstaub liefert, wirst du jemanden dafür bezahlen müssen. Wenn du HIER Hilfe willst, wirst du deutlich mehr liefern müssen. Aber das haben wir dir ja nun schon seit Anbeginn deiner Karriere hier dargelegt, oder?
Benutzeravatar
noisefloor
User
Beiträge: 2225
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: button placement.

Beitragvon noisefloor » Donnerstag 25. Januar 2018, 07:32

Hallo,

Tkinter kennt drei verschiedene Layout Manager, damit kannst du Element platzieren. Wenn du jetzt fragen möchtest: "Wie?" -> RTMF. Dazu gibt es etliche Threads hier im Forum und tausende Seiten im Internet.

`btn = Button(tk, width=20, height=30, text="hallo", fg='red', bg='black', command=hi)` ist IMHO relativ sinnfrei - warum soll sich ein Button bei ein Klick darauf selber aufrufen?

Der mainloop macht das, was der Name sagt: es ist die Hauptschleife von Tkinter, die alle Interaktionen mit der GUI kontrolliert bzw. darauf reagiert.

Gruß, noisefloor
jan.b
User
Beiträge: 160
Registriert: Mittwoch 9. August 2017, 17:12

Re: button placement.

Beitragvon jan.b » Donnerstag 25. Januar 2018, 21:55

der button ruft sich ja über btn.pack auf. und ich glaube ohne geht's nicht.
jan.b
User
Beiträge: 160
Registriert: Mittwoch 9. August 2017, 17:12

Re: button placement.

Beitragvon jan.b » Donnerstag 25. Januar 2018, 21:59

ich habe ehrlich gesagt nicht genug zeit für den ganzen quatsch. manchmal brauche ich schnelle präzise antworten auf spezifische fragen. @noisenfloor hat's ja auch irgendwie hinbekommen einen antwort satz zu schreiben, der ein wenig hilfreich war. es ist nicht die konventionelle art etwas zu lernen, aber wenn du eine frage siehst, auf die du in ein oder zwei sätzen antorten kannst, wäre es einfach nur nett dies auch zu tun.
Benutzeravatar
noisefloor
User
Beiträge: 2225
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Re: button placement.

Beitragvon noisefloor » Freitag 26. Januar 2018, 07:19

Hallo,

@jan.b: Wenn du präzisere Antworten brauchst, dann stell' doch aml präzise Fragen. Was heißt "umpositionieren"? Du hast eine 400x400px großes Fenster mit einem Button. Umpositionieren kann alles mögliche sein - links oben, rechts unten, horizontal mittig 25% außerhab der vertikalen Mitte usw.

`pack()`kennt zusätzliche Argumente zu Positionierng -> RTMF

Außerdem mangelt es deiner Art der Kommunikation hier, also wie du antwortest, manchmal doch ein sozialer Verträglichkeit. Sprich die Motivation der hier regelmäßig helfenden, zu antworten, ist dann eher gering.

Und außerdem liegt bei dir auch immer, bezogen auf die Fragen und Antworten die Vermutung nah, dass deine Motivation, selber etwas herauszufinden und zu erarbeiten, eher gering ist. Hier im Forum gibt's Hilfe zur Selbsthilfe. Wenn Selbsthilfe nicht so dein Ding ist, dann ist das auch ein schlechter Ausgangspunkt für python-forum.de.

Gruß, noisefloor
Benutzeravatar
__deets__
User
Beiträge: 2137
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: button placement.

Beitragvon __deets__ » Freitag 26. Januar 2018, 09:23

Keine deiner Fragen hier im Thread war spezifisch. Und du bist ein Schüler, du weißt noch nicht mal , was es heißt, keine Zeit zu haben. Mal abgesehen davon, das es kein Quatsch ist, was wir hier verlangen. Sondern notwendig. Was du überhaupt nicht einschätzen kannst, mangels Grundlagen.

Du hast einfach keinen Bock drauf auch nur ein Iota Anstrengung zu unternehmen, sondern willst ohne eigenen Aufwand abgreifen. Wird nix werden.
Benutzeravatar
wuf
User
Beiträge: 1360
Registriert: Sonntag 8. Juni 2003, 09:50

Re: button placement.

Beitragvon wuf » Freitag 26. Januar 2018, 13:32

__deets__ hat geschrieben:Wuf permanent so etwas postet?
Hier ist der 'wuf' schon wieder: :)

Hi Jan.b

Habe hier eine kleine Demo für die Platzierung des Buttons mit dem Pack-Layouter geschrieben:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Tkinter for Python 3.xx
  5. import tkinter as tk
  6.  
  7. APP_TITLE = "Button placing with pack layouter"
  8. APP_XPOS = 100
  9. APP_YPOS = 100
  10. APP_WIDTH = 600
  11. APP_HEIGHT = 200
  12.  
  13. SIDES = ['top', 'right', 'bottom', 'left']
  14. ANCHORS = ['center', 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw']
  15. FONT = ('Helevetica', 14, 'bold')
  16.  
  17.        
  18. class Application(tk.Tk):
  19.  
  20.     def __init__(self):
  21.         tk.Tk.__init__(self)
  22.         self.title(APP_TITLE)
  23.    
  24.     def build(self):
  25.         self.protocol("WM_DELETE_WINDOW", self.close_app)
  26.         self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
  27.         self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
  28.         self.option_add("*Button.highlightThickness", 0)
  29.        
  30.         frame = tk.Frame(self, bg='#FFFF00')
  31.         frame.pack(fill='both', expand=True)
  32.        
  33.         self.pos_var = tk.StringVar()
  34.         self.button = tk.Button(frame, textvariable=self.pos_var, width=18,
  35.             height=2, font=FONT)
  36.         self.button.pack(padx=10, pady=10)
  37.  
  38.         self.place_the_button()
  39.        
  40.     def place_the_button(self, pos_index=0, pos_mode='side'):
  41.         if pos_mode == 'side':    
  42.             side = SIDES[pos_index]
  43.             self.pack_with_side(side)
  44.             pos_index += 1
  45.             if pos_index >= len(SIDES):
  46.                 pos_index = 0
  47.                 pos_mode = 'anchor'
  48.                
  49.         elif pos_mode == 'anchor':
  50.             anchor = ANCHORS[pos_index]
  51.             self.pack_with_anchor(anchor)
  52.             pos_index += 1
  53.             if pos_index >= len(ANCHORS):
  54.                 pos_index = 0
  55.                 pos_mode = 'side'
  56.  
  57.         self.after(2000,self.place_the_button, pos_index, pos_mode)
  58.  
  59.     def pack_with_side(self, side):
  60.         # Wichtige voreingestellte Optionen für die Anwendung von 'side' sind:
  61.         # 'anchor' = 'center'
  62.         # 'expand' = False
  63.         print('Side:', self.button.pack_info())
  64.        
  65.         self.button.config(bg='#90EE90')
  66.         self.pos_var.set("Position with side:\n'{}'".format(side))
  67.         self.button.pack_configure(side=side, anchor='center', expand=False)
  68.        
  69.     def pack_with_anchor(self, anchor):
  70.         # Wichtige voreingestellte Optionen für die Anwendung von 'anchor' sind:
  71.         # 'expand' = True
  72.         print('Anchor:', self.button.pack_info())
  73.        
  74.         self.button.config(bg='#1AB7EA')
  75.         self.pos_var.set("Position with anchor:\n'{}'".format(anchor))
  76.         self.button.pack_configure(anchor=anchor, expand=True)
  77.        
  78.     def close_app(self):
  79.         # Here do something before apps shutdown
  80.         print("Good Bye!")
  81.         self.destroy()
  82.  
  83.        
  84. def main():        
  85.     app = Application()
  86.     app.build()
  87.     app.mainloop()
  88.  
  89.    
  90. if __name__ == '__main__':
  91.     main()      
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
__deets__
User
Beiträge: 2137
Registriert: Mittwoch 14. Oktober 2015, 14:29

Re: button placement.

Beitragvon __deets__ » Freitag 26. Januar 2018, 14:44

Wenn es nur eine Moeglichkeit gegben haette, sich solcher Art Code hier aus dem Forum rauszusuchen...

https://www.google.com/search?q=site%3A ... e&ie=UTF-8

@wuf: wenn die App-Klasse eh nur sinnvoll ist, wenn "build" aufgerufen wird, ist es angezeigt, diesen Aufruf gleich in __init__ zu taetigen.

Fuer mainloop gilt das natuerlich nicht. Das sollte getrennt bleiben, damit man zwischen App instantiieren und Eintritt in die Ereignisbearbeitung noch Luft hat.
Benutzeravatar
wuf
User
Beiträge: 1360
Registriert: Sonntag 8. Juni 2003, 09:50

Re: button placement.

Beitragvon wuf » Freitag 26. Januar 2018, 15:23

@__deets__: Danke für deinen Tipp. Habe mein Skript angepasst:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. # Tkinter for Python 3.xx
  5. import tkinter as tk
  6.  
  7. APP_TITLE = "Button placing with pack layouter"
  8. APP_XPOS = 100
  9. APP_YPOS = 100
  10. APP_WIDTH = 600
  11. APP_HEIGHT = 200
  12.  
  13. SIDES = ['top', 'right', 'bottom', 'left']
  14. ANCHORS = ['center', 'n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw']
  15. FONT = ('Helevetica', 14, 'bold')
  16.  
  17.        
  18. class Application(tk.Tk):
  19.  
  20.     def __init__(self):
  21.         tk.Tk.__init__(self)
  22.         self.title(APP_TITLE)
  23.         self.build()
  24.        
  25.     def build(self):
  26.         self.protocol("WM_DELETE_WINDOW", self.close_app)
  27.         self.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
  28.         self.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))
  29.         self.option_add("*Button.highlightThickness", 0)
  30.        
  31.         frame = tk.Frame(self, bg='#FFFF00')
  32.         frame.pack(fill='both', expand=True)
  33.        
  34.         self.pos_var = tk.StringVar()
  35.         self.button = tk.Button(frame, textvariable=self.pos_var, width=18,
  36.             height=2, font=FONT)
  37.         self.button.pack(padx=10, pady=10)
  38.  
  39.         self.place_the_button()
  40.        
  41.     def place_the_button(self, pos_index=0, pos_mode='side'):
  42.         if pos_mode == 'side':    
  43.             side = SIDES[pos_index]
  44.             self.pack_with_side(side)
  45.             pos_index += 1
  46.             if pos_index >= len(SIDES):
  47.                 pos_index = 0
  48.                 pos_mode = 'anchor'
  49.                
  50.         elif pos_mode == 'anchor':
  51.             anchor = ANCHORS[pos_index]
  52.             self.pack_with_anchor(anchor)
  53.             pos_index += 1
  54.             if pos_index >= len(ANCHORS):
  55.                 pos_index = 0
  56.                 pos_mode = 'side'
  57.  
  58.         self.after(2000,self.place_the_button, pos_index, pos_mode)
  59.  
  60.     def pack_with_side(self, side):
  61.         # Wichtige voreingestellte Optionen für die Anwendung von 'side' sind:
  62.         # 'anchor' = 'center'
  63.         # 'expand' = False
  64.         print('Side:', self.button.pack_info())
  65.        
  66.         self.button.config(bg='#90EE90')
  67.         self.pos_var.set("Position with side:\n'{}'".format(side))
  68.         self.button.pack_configure(side=side, anchor='center', expand=False)
  69.        
  70.     def pack_with_anchor(self, anchor):
  71.         # Wichtige voreingestellte Optionen für die Anwendung von 'anchor' sind:
  72.         # 'expand' = True
  73.         print('Anchor:', self.button.pack_info())
  74.        
  75.         self.button.config(bg='#1AB7EA')
  76.         self.pos_var.set("Position with anchor:\n'{}'".format(anchor))
  77.         self.button.pack_configure(anchor=anchor, expand=True)
  78.        
  79.     def close_app(self):
  80.         # Here do something before apps shutdown
  81.         print("Good Bye!")
  82.         self.destroy()
  83.  
  84.                
  85. Application().mainloop()
Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
kbr
User
Beiträge: 774
Registriert: Mittwoch 15. Oktober 2008, 09:27
Wohnort: Düsseldorf

Re: button placement.

Beitragvon kbr » Freitag 26. Januar 2018, 16:03

@Wuf: die Reduktion auf

  1. Application().mainloop()

ist auch nicht ideal, denn so verwirfst Du das Applikationsobjekt unmittelbar, sobald die Mainloop beendet wird. Dein vorheriger Ansatz, allerdings ohne den Aufruf von 'build', da dieses nach dem Hinweis von __deets__ nun in der Initialisierung mit integriert ist, war da sauberer. Kompakten Code zu schreiben ist gut, zu kompakt hingegen bringt keinen Vorteil.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Torsten_K