Форум программистов, компьютерный форум, киберфорум
Наши страницы
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
freeman86
0 / 0 / 0
Регистрация: 20.07.2016
Сообщений: 97
1

Global переменные и как их обойти в моем случае

13.02.2020, 15:47. Просмотров 844. Ответов 1

Это урезанный пример из проекта, такой чтобы было понятно в чем суть вопроса. На сколько мне известно использовать global не очень хорошая практика. Я не понимаю как в данном случае избавится от global. Думал что можно это сделать, загнав все в классы, но там начинается "конфликт метаклассов" и еще какая-то хрень..в общем, я решил что не очень хорошая идея наследоваться от serial и tkinter в один собственный класс. Да и не силен я в ооп. Может чего подскажите?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from tkinter import *
import serial
 
def Com():
    global ser
    ser = serial.Serial('com1', 9600)
    print(ser)
 
def Write():
    global ser
    print(ser.write(1))
    ser.close()
 
root = Tk()
root.geometry('200x100')
 
Btn1 = Button(root, text='open', width='15', height='1')
Btn1.configure(command=Com)
Btn1.pack(pady='10')
 
Btn2 = Button(root, text='write', width='15', height='1')
Btn2.configure(command=Write)
Btn2.pack(pady='10')
 
root.mainloop()
При таком варианте подключение создается, однако вместо записи в порт происходит ошибка. Почему? Отличие от первого в том, что объект ser создается вне функции и соответственно не используется global

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from tkinter import *
import serial
 
ser = serial.Serial()
 
def Com():
    ser = serial.Serial('com1', 9600)
    print(ser)
 
def Write():
    print(ser.write(1))
    ser.close()
 
root = Tk()
root.geometry('200x100')
 
Btn1 = Button(root, text='open', width='15', height='1')
Btn1.configure(command=Com)
Btn1.pack(pady='10')
 
Btn2 = Button(root, text='write', width='15', height='1')
Btn2.configure(command=Write)
Btn2.pack(pady='10')
 
root.mainloop()
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.02.2020, 15:47
Ответы с готовыми решениями:

Как создать отчет в моем случае?
Здравствуйте, объясните, пожалуйста, как мне создать отчет. У меня есть грид в форме, в нем...

Как подключить 2 монитора в моём случае?
Здравствуйте. Купил монитор Dell P2414H (1920х1080). У него есть следующие порты: - DisplayPort...

Как сделать unregisterReceiver в моем случае?
вот так я регистрирую ресивер для отправки SMS: getActivity().registerReceiver(new...

Как в моём случае повысить производительность?
В компьютерном железе не разбираюсь, в совместимости тем более, но хочу повысить производительность...

Как обратиться к объекту в моем случае
Знатоки, будьте добры подскажите, как правильно обратиться к объектам и их данным? $result =...

1
ioprst
599 / 384 / 209
Регистрация: 12.03.2018
Сообщений: 1,350
13.02.2020, 15:58 2
Лучший ответ Сообщение было отмечено freeman86 как решение

Решение

Потому что ser является локальным объектом для метода Com. Для Write set == serial.Serial() (т.е. вызов Com ни на что не повлияет).
Используйте класс. Наследуйте его от Tk. Сделайте Com и Write методами класса, а ser атрибутом класса (хотя методы тоже являются атрибутами).

Что-то типа такого (не проверял)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from tkinter import *
import serial
 
class Window(Tk):
 
    def __init__(self):
        Tk.__init__(self)
        self.geometry('200x100')
 
        self.Btn1 = Button(self, text='open', width='15', height='1')
        self.Btn1.configure(command=self.Com)
        self.Btn1.pack(pady='10')
 
        self.Btn2 = Button(self, text='write', width='15', height='1')
        self.Btn2.configure(command=self.Write)
        self.Btn2.pack(pady='10')
 
        self.ser = None
 
    def Com(self):
        self.ser = serial.Serial('com1', 9600)
        print(self.ser)
 
    def Write(self):
        print(self.ser.write(1))
        self.ser.close()
 
 
w = Window()
w.mainloop()
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.02.2020, 15:58

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как сделать случайное число в моём случае?
Есть следующий фрагмент кода: <div class="stats__block-value" id="count-users"...

Как обращаться к элементам массива в моем случае?
#include <stdio.h> #include <conio.h> extern int asmproc(int matrix, int dimension); main() { ...

Как правильно заполнить запись в моем случае?
Здравствуйте, подскажите, пожалуйста, как правильно заполнить запись в таком случае: моя бд...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.