Problém při zapisování do proměnné – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém při zapisování do proměnné – Python – Fórum – Programujte.comProblém při zapisování do proměnné – Python – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
30. 1. 2014   #1
-
0
-

Zdravím. Projížděl jsem fórum a nic podobného jsem nenašel tak snad se nebudu opakovat. Kdyžtak se předem omlouvám.

Jsem nováčkem v Pythonu. Snažím se udělat program, který mi bude ukazovat výsledek, když zmáčknu tlačitko "+1". Chtěl jsem, aby se při každém kliknutí k "x" přičetla 1. Jenže když klikám, nic to nedělá a místo toho to vypisuje chybu:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1482, in __call__
    return self.func(*args)
  File "C:/Users/lexax_000/PycharmProjects/Ruleta-hra/zkouska", line 10, in jedna
    x+=1
UnboundLocalError: local variable 'x' referenced before assignment

Tady je kód:

# -*- coding: utf-8 -*-
import random
from tkinter import *

okno = Tk()

x = 0

def secti():
    x+=1

scitani = Button(okno, text="+1", command=secti)
scitani.pack()

vysledek = Label(okno, text=x)
vysledek.pack()

okno.mainloop()

Prosím poraďte

Nahlásit jako SPAM
IP: 91.221.212.–
z
~ Anonymní uživatel
268 příspěvků
31. 1. 2014   #2
-
0
-

Když ve funkci nastavuješ hodnotu proměnné, tak se vytvoří jako lokální proměnná té funkce. Takže ty tam máš jedno x globální a jedno x lokální ve funkci secti. Tu jedničku přičítáš k tomu lokálnímu, ale ono ještě nemá žádnou hodnotu a proto to křičí (a i kdyby hodnotu mělo, tak se ta změna neprojeví na tom globálním x, pracuješ pořád jen s tím lokálním).

Kdybys hodnotu toho x neměnil a třeba ji jen vypisoval, tak se to lokální bez hodnoty nevytvoří, ale normálně se vypíše hodnota toho globálního.

Prostě, když chceš ve funkci pracovat s globálními proměnnými, tak raději vždy použij příkaz global:

def secti():
    global x
    x+=1
Nahlásit jako SPAM
IP: 88.101.8.–
Kit+15
Guru
31. 1. 2014   #3
-
0
-

#2 z
Bez toho "global" by to nešlo?

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Ericsko+3
Stálý člen
31. 1. 2014   #4
-
+1
-
Zajímavé
Kit +

Standardne by mala funkcia nieco prijat ako parameter a nieco vratit ako vysledok:

def secti(x):
    x += 1
    return x

Python je pre mna tiez novy, ale vyguglil som pre teba toto: 

scitani = Button(okno, text='+1', command=secti: action(x))
Nahlásit jako SPAM
IP: 87.197.170.–
31. 1. 2014   #5
-
0
-

Díky moc:) Už to funguje ale mám ještě jeden problém. Dal jsem "vysledek" do funkce "secti", aby se mi po každém stisku tlačítka zobrazil nový výsledek:

# -*- coding: utf-8 -*-
import random
from tkinter import *

okno = Tk()

x = 0

def secti():
    global x
    x += 1
    vysledek = Label(okno, text=x)
    vysledek.pack()

scitani = Button(okno, text="+1", command=secti)
scitani.pack()

okno.mainloop()

Jenže to teď dělá to, že mi to sice vytiskne nový výsledek, ale pod ten starý. Takže to pak v programu vypadá takto:

0
1
2
atd.

Nevíte jak by se dalo udělat, aby se starý výsledek nahradil novým místo toho, aby se vytisknul pod ten starý?

Nahlásit jako SPAM
IP: 91.221.212.–
Kit+15
Guru
31. 1. 2014   #6
-
0
-

#4 Ericsko 

K tomu bych měl jen jednu připomínku, jinak OK.

def secti(x):
    return x + 1
Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Ericsko+3
Stálý člen
31. 1. 2014   #7
-
0
-

#6 Kit
I like simplicity too.. ;)

Nahlásit jako SPAM
IP: 87.197.170.–
z
~ Anonymní uživatel
268 příspěvků
31. 1. 2014   #8
-
0
-

#3 Kit
Jestli narážíš na to, že je to trošku čuňačinka, tak na to přijde časem.

Nahlásit jako SPAM
IP: 88.101.8.–
Kit+15
Guru
31. 1. 2014   #9
-
0
-

#8 z
Když jsem na podobnou čuňačinku narazil ve Wordpressu, tak mě z toho málem trefilo. Navíc přesně kvůli tomu mi to nefungovalo, dokud jsem to neopravil.

Nahlásit jako SPAM
IP: 46.174.34.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Řešení
Wrunx
~ Anonymní uživatel
35 příspěvků
31. 1. 2014   #10
-
0
-
Vyřešeno Nejlepší odpověď

Zkus to takto:

import random
from Tkinter import *

okno = Tk()

x = 0
var = StringVar()

def secti():
	global x
	x += 1
	var.set(x)

scitani = Button(okno, text="+1", command=secti)
scitani.pack()
vysledek = Label(okno,textvariable=var)
vysledek.pack()

okno.mainloop()
Nahlásit jako SPAM
IP: 188.120.195.–
31. 1. 2014   #11
-
0
-

textvariable ahaa:) Díky moc už to funguje jak má

Nahlásit jako SPAM
IP: 91.221.212.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý