array inhalt bearbeitung

Fragen zu Tkinter.
Infrared
User
Beiträge: 18
Registriert: Montag 31. August 2009, 16:43

codefolge:

Code: Alles auswählen

global feld
feld=[9,9,9,9,9,9]

def verteilen():
  L1.configure (text=feld[1]+1)
Der Inhalt der array ("felder") wird in Button angezeigt. Ich möchte das wenn man darauf klickt, der Inhalt (der text (arrays/felder)) bearbeitet wird. Z.B soll dann statt 9, eine 10 dort stehen. (9+1=10 ^^)

Bekomme keine vernünftige Funktion hin. Helft mir bitte :(
Zuletzt geändert von Infrared am Freitag 6. November 2009, 23:06, insgesamt 1-mal geändert.
Wer einem eine Bratwurst brät, hat ein Bratwurst-bratgerät !?!

Mfg
Infrared
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Infrared hat geschrieben:Bekomme keine vernümpftige Funktion hin. Helft mir bitte :(
Es heißt "vernünftige" ...

1. global nach Möglichkeit vermeiden.
2. global ist hier komplett überflüssig.
3. PEP 8 beachten: Bezeichner klein schreiben
4. Aussagekräftige Bezeichner wählen ("L1")
5. Präziser beschreiben, was du erreichen willst: Welche der 9en soll denn geändert werden? Alle? Gar keine?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ausserdem ist das kein `array`, sondern eine Liste.
Infrared
User
Beiträge: 18
Registriert: Montag 31. August 2009, 16:43

Ne das ist keine Liste ^^ Von mir aus nennt das auch array[...] ist das gleiche wie mit feld !?!

Aber kann mir jemand vielleicht so eine funktion schreiben? Sind doch max. 2 Zeilen.
Wer einem eine Bratwurst brät, hat ein Bratwurst-bratgerät !?!

Mfg
Infrared
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Infrared hat geschrieben:Ne das ist keine Liste ^^ Von mir aus nennt das auch array[...] ist das gleiche wie mit feld !?!
Doch, das ist eine Liste. Ein Array ist ein Datentyp der eine feste Anzahl von Elementen gleichen Typs speichert. Weder das eine noch das andere trifft bei Pythons Listen zu.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Infrared hat geschrieben:Aber kann mir jemand vielleicht so eine funktion schreiben? Sind doch max. 2 Zeilen.
Na dann, mach's doch schnell selber. Ist doch kein Ding.
Falls du es dann doch nicht selbst machen willst:
numerix hat geschrieben:5. Präziser beschreiben, was du erreichen willst: Welche der 9en soll denn geändert werden? Alle? Gar keine?
Infrared
User
Beiträge: 18
Registriert: Montag 31. August 2009, 16:43

ok, da ich den code einfach nicht gebacken bekomme:

Code: Alles auswählen

#Zahlenangaben

feld=[9,0,0,0]

#Buttons

L1 = Button(QD1, text=feld[0],command=setzeneu)
L1.pack(side=LEFT)

L2 = Button(QD1, text=feld[1],command=setzeneu)
L2.pack(side=LEFT)

L3 = Button(QD1, text=feld[2],,command=setzeneu)
L3.pack(side=LEFT)

L4 = Button(QD1, text=feld[3],,command=setzeneu)
L4.pack(side=LEFT)
So jetzt brauch ich also die Funktion "setzeneu" und zwar:
Wenn man auf Button L1 klickt sollen da 9 abgezogen werden und auf die nächsten 9 Felder verteilt werden (habe nur 3 weitere angegeben).

Also: Klick L1 : L1 = 0
Alle 9 Buttons nach L1: +1

Am besten wäre natürlich noch, das wenn man dann auf L2 klickt (wo dann ja 1 drin stände), der L2 auf 0 setzt und L3 +1.
Also das man das ganze nicht speziell für jeden Button einzeln machen muss, da es da etliche Möglichkeiten gibt. Wenn das nicht zu viel verlangt ist :roll:
Wer einem eine Bratwurst brät, hat ein Bratwurst-bratgerät !?!

Mfg
Infrared
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Ich sehe von deiner Seite kein ernsthaftes Bemühen, die dir angebotenen Ratschläge und Hilfen umzusetzen.
numerix hat geschrieben:3. PEP 8 beachten: Bezeichner klein schreiben
4. Aussagekräftige Bezeichner wählen ("L1")
Das sieht immer noch genauso aus wie vorher.

Und: Das, was du als (letzten) Code zeigst, ist noch nicht einmal lauffähig.
BlackJack

Interessant bei solchen Fragen ist ja auch immer das Raten, welches zugrundelegende, grössere Problem *eigentlich* gelöst werden soll. Meine Kristallkugel behauptet es geht um Kalaha!? Und hat sie recht, oder war's doch nicht so gut, dass sie neulich mal runtergefallen ist? :-)
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Dann scheint das Tic-Tac-Toe Spiel also schon fertig zu sein!?
(SCNR)

:wink:
yipyip
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dies soll nur mal das Prinzip verdeutlichen:

Code: Alles auswählen

button_list = []
for i, item in enumerate(feld):
    button = tk.Button(master, text=str(item),
                       command=lambda arg=i: change(arg))
    button_list.append(button)
    button.pack(side=tk.LEFT)

def change(i):
    # Mach hier, was Du willst
Der Code ist natürlich nicht lauffähig und damit auch ungetestet.
MfG
HWK
Infrared
User
Beiträge: 18
Registriert: Montag 31. August 2009, 16:43

numerix hat geschrieben:Ich sehe von deiner Seite kein ernsthaftes Bemühen, die dir angebotenen Ratschläge und Hilfen umzusetzen.
Und: Das, was du als (letzten) Code zeigst, ist noch nicht einmal lauffähig.
Ich bin ein Anfänger ^^
Und natürlich ist der Code nicht lauffähig. Er ist ja auch normal ca. 3x so lang. Aber um zu verstehen was ich möchte braucht man doch kein tkinter import oder das den ganzen Rest vom Standartgerüst.

HWK: Danke für deine Mühe, hat mir ein Stück weit weiter geholfen, aber ich komm damit nicht ganz klar.

yipyip: War das mit dem tic tac toe an mich gerichtet? :shock: Keine Ahnung wo von du sprichst

Dann stell ich meine Frage mal neu:
In einzelnen Buttons wird der Inhalt von "feld=[..]" angezeigt.
Also z.B text=feld[1]
Ich möchte jetzt eine definition erstellen, dass wenn ich auf den Button klicke er z.B bei feld[2] einen Abzieht

Ich stell mir das so vor:
text=feld[2]-1
Aber das klappt nicht, ich finde nichts bei google und vielleicht mach mir das Leben auf einfach gerade schwer?
Er soll also den Inhalt von feld2 auslesen und einen davon abziehen.
Sagen wir feld[2] ist 9.
Wenn ich auf einen Button klicke, dann soll feld[2]-1 (Also dann 8 )

Ich bin hier auch kurz vor dem verzweifeln
Wer einem eine Bratwurst brät, hat ein Bratwurst-bratgerät !?!

Mfg
Infrared
BlackJack

@Infrared: Das Du Anfänger bist, kann doch kein Grund sein Ratschläge wie vernünftige Namensgebung zu verwenden, zu ignorieren. Im Gegenteil, wenn man dass nicht am Anfang lernt, wann dann?

Ohne lauffähige, möglichst minimale Beispiele, ist es schwer Deine Fragen überhaupt zu verstehen, denn drumherum beschreibst Du das in Sätzen die zum Teil ziemlich unverständlich sind. So etwas wie `Wenn ich auf einen Button klicke, dann soll feld[2]-1 (Also dann 8 )` ist einfach kein vollständiger Satz. Und wenn Du das umgangssprachlich nicht präzise, oder zumindest verständlich beschreiben kannst, geht das bei Programmiersprachen genauso daneben. Wir können ja noch raten was Du vielleicht meinen könntest, wozu aber wohl auch nicht alle hier unbegrenzt Lust haben werden, aber der Python-Interpreter rät nicht, sondern macht exakt das was Du ihm in einer formal recht präzisen Sprache sagst.

Was auch immer das *wirkliche* Problem ist, was Du lösen möchtest, solltest Du es vielleicht erst einmal ohne GUI lösen.

Und bevor Du an die GUI gehst, musst Du die Grundlagen von Python verstanden haben, am besten bis einschliesslich Objektorientierung, oder alternativ funktionale Programmierung bis ``lambda`` oder `functools.partial()` bzw. Closures.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Infrared hat geschrieben:HWK: Danke für deine Mühe, hat mir ein Stück weit weiter geholfen, aber ich komm damit nicht ganz klar.
...
Dann stell ich meine Frage mal neu:
In einzelnen Buttons wird der Inhalt von "feld=[..]" angezeigt.
Also z.B text=feld[1]
Ich möchte jetzt eine definition erstellen, dass wenn ich auf den Button klicke er z.B bei feld[2] einen Abzieht

Ich stell mir das so vor:
text=feld[2]-1
Aber das klappt nicht, ich finde nichts bei google und vielleicht mach mir das Leben auf einfach gerade schwer?
Er soll also den Inhalt von feld2 auslesen und einen davon abziehen.
Sagen wir feld[2] ist 9.
Wenn ich auf einen Button klicke, dann soll feld[2]-1 (Also dann 8 )
Da meine Kristallkugel grade frisch von der Inspektion zurück ist, werd ich sie mal anwerfen.

Soweit ich dich verstehe, möchtest du entweder, 1) dass auf dem Button eine Zahl steht, die jedesmal um eins kleiner wird, wenn du draufdrückst. Ja? Oder, du möchtest, 2) dass der Button, nachdem du ihn drückst, die Zahl Null anzeigt und die auf den nachfolgenden Buttons stehenden Zahlen jeweils um eins erhöht werden. Ja? Egal ob 1) oder 2), soll deine zugrunde liegende Datenstuktur ge-updatet werden, also die zu den Buttons korrespondierenden Felder sollen ebenfalls die entsprechenden Werte annehmen. Ja? In jedem Fall ist HWKs Vorschlag ein guter Ausgangspunkt, du musst nur irgendwas in dieser Art in change(i) machen:

Code: Alles auswählen

def change(i):
    ...
    n = ...feld[i]...  # <-- hier neuen Wert berechnen
    feld[i] = n
    button_list[i]["text"] = str(n)
    ...
BlackJack hat übrigens recht, und wenn du HWKs oder meinen Code nicht verstehst, dann musst du leider vorerst kleinere Brötchen backen und dir die Grundlagen draufschaffen.

Gruß,
Mick.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo Infrared

Bezugnehmend auf deine erste Frage. Hier eine von vielen Lösungen:

Code: Alles auswählen

import Tkinter as tk

def update_feld(index, feld, button):
    number = feld[index] + 1
    feld[index] = number
    button.config(text=number)
    print 'feld =',feld

app_win = tk.Tk()
app_win.geometry('100x200')
app_win.config(bg='steelblue')

feld=[9,9,9,9,9,9]

for index, data in enumerate(feld):
    button = tk.Button(app_win, text=data, width=3)
    button.pack(side='top', expand='yes')
    button.config(command=lambda id=index, data=feld, obj=button:\
        update_feld(id, data, obj))

app_win.mainloop()
Gruss wuf :wink:
Take it easy Mates!
Infrared
User
Beiträge: 18
Registriert: Montag 31. August 2009, 16:43

Ja genauso mein ich das, pillmuncher.
Gibt es für Python nicht die Möglichkeit einfach eine If Funktion zu erstellen?
In Actionscript würde es heißen

Code: Alles auswählen

if pressed.button("name"){
"textname"+1;
}

Und das versuch ich in Python zu erstellen! Auf jeden Fall habt ihr mich bis hier hin schon ein ganzes Stück klüger gemacht was Python angeht :D
Wer einem eine Bratwurst brät, hat ein Bratwurst-bratgerät !?!

Mfg
Infrared
BlackJack

@Infrared: Irgendwie mag ich nicht glauben, dass das in den geschweiften Klammern in ActionScript das macht, was Du haben willst. Und nein -- so kann man das auch in Python nicht schreiben.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was soll denn eine if-Funktion sein? Ich kann mir if-Funktionen nur in Sprachen mit nicht-Strikter Parameterverarbeitung vorstellen, in allen anderen kann man ``if`` entweder nicht einfach so implementieren sondern benötigt Proxy-Objekte oder benutzt Makros.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Infrared
User
Beiträge: 18
Registriert: Montag 31. August 2009, 16:43

was für proxy-dinger? ^^
Bleiben wir bei Python
Gibt es dazu also keine einfache variante?[/u]
Wer einem eine Bratwurst brät, hat ein Bratwurst-bratgerät !?!

Mfg
Infrared
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

@Infrared:
Ich spreche von
http://www.python-forum.de/topic-20078.html
oder verwechsle ich da irgendwen?

:wink:
yipyip
Zuletzt geändert von yipyip am Sonntag 8. November 2009, 00:53, insgesamt 1-mal geändert.
Antworten